text:
package com.jamesmorrisstudios.googleplaylibrary.activities;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.AppCompatSpinner;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;

import com.android.vending.billing.IInAppBillingService;
import com.chartboost.sdk.Chartboost;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.games.Games;
import com.google.android.gms.games.multiplayer.Multiplayer;
import com.google.android.gms.games.multiplayer.realtime.RoomConfig;
import com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatch;
import com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchConfig;
import com.google.android.gms.games.snapshot.SnapshotMetadata;
import com.google.android.gms.games.snapshot.Snapshots;
import com.jamesmorrisstudios.appbaselibrary.AutoLockOrientation;
import com.jamesmorrisstudios.appbaselibrary.Bus;
import com.jamesmorrisstudios.appbaselibrary.UtilsDisplay;
import com.jamesmorrisstudios.appbaselibrary.UtilsVersion;
import com.jamesmorrisstudios.appbaselibrary.activities.BaseActivity;
import com.jamesmorrisstudios.appbaselibrary.activityHandlers.SnackbarRequest;
import com.jamesmorrisstudios.appbaselibrary.app.AppBase;
import com.jamesmorrisstudios.appbaselibrary.preferences.Prefs;
import com.jamesmorrisstudios.googleplaylibrary.R;
import com.jamesmorrisstudios.googleplaylibrary.activityHandlers.GooglePlayActivityResultManager;
import com.jamesmorrisstudios.googleplaylibrary.activityHandlers.GooglePlayDialogBuildManager;
import com.jamesmorrisstudios.googleplaylibrary.fragments.AchievementFragment;
import com.jamesmorrisstudios.googleplaylibrary.fragments.LeaderboardFragment;
import com.jamesmorrisstudios.googleplaylibrary.fragments.LeaderboardMetaFragment;
import com.jamesmorrisstudios.googleplaylibrary.fragments.OnlineLoadGameFragment;
import com.jamesmorrisstudios.googleplaylibrary.fragments.PlayerPickerFragment;
import com.jamesmorrisstudios.googleplaylibrary.googlePlay.GameHelper;
import com.jamesmorrisstudios.googleplaylibrary.googlePlay.GooglePlay;
import com.jamesmorrisstudios.googleplaylibrary.googlePlay.GooglePlayCalls;
import com.jamesmorrisstudios.googleplaylibrary.iab.IabHelper;
import com.jamesmorrisstudios.googleplaylibrary.iab.IabResult;
import com.jamesmorrisstudios.googleplaylibrary.iab.Inventory;
import com.jamesmorrisstudios.googleplaylibrary.iab.Purchase;
import com.jamesmorrisstudios.googleplaylibrary.util.UtilsAds;
import com.jamesmorrisstudios.jmsgameslibrary.client.JMSGamesCalls;
import com.jamesmorrisstudios.jmsgameslibrary.client.JMSHelper;
import com.mopub.common.MoPub;
import com.mopub.common.MoPubReward;
import com.mopub.mobileads.MoPubErrorCode;
import com.mopub.mobileads.MoPubInterstitial;
import com.mopub.mobileads.MoPubRewardedVideoListener;

import java.util.ArrayList;
import java.util.Set;

/**
 * Activity that handles all the google play services calls and ad handling
 * <p/>
 * Created by James on 5/11/2015.
 */
public abstract class GooglePlayActivity extends BaseActivity implements
        GooglePlay.GooglePlayListener,
        GameHelper.GameHelperListener,
        LeaderboardMetaFragment.OnLeaderboardMetaListener,
        LeaderboardFragment.OnLeaderboardListener,
        MoPubInterstitial.InterstitialAdListener,
        JMSHelper.JMSHelperListener,
        JMSGamesCalls.JMSListener {

    //Constants
    private final static String UPGRADE_PRO_SKU = "remove_ads_1";
    private final static int RC_LOOK_AT_MATCHES = 10000;
    private final static int RC_LOOK_AT_SNAPSHOTS = 10001;
    private final static int RC_SELECT_PLAYERS = 11000;
    // The game helper object. This class is mainly a wrapper around this object.
    protected GameHelper mHelper;
    protected JMSHelper jmsHelper;
    // We expose these constants here because we don't want users of this class
    // to have to know about GameHelper at all.
    public static final int CLIENT_GAMES = GameHelper.CLIENT_GAMES;
    public static final int CLIENT_SNAPSHOT = GameHelper.CLIENT_SNAPSHOT;
    public static final int CLIENT_ALL = GameHelper.CLIENT_ALL;
    // Requested clients. By default, that's just the games client.
    protected boolean mDebugLog = true;
    //In app billing
    protected IInAppBillingService mService;
    protected IabHelper iabHelper;
    //Activity handlers
    GooglePlayDialogBuildManager dialogBuildManager;
    GooglePlayActivityResultManager activityResultManager;
    //In app billing connection listener
    ServiceConnection mServiceConn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = IInAppBillingService.Stub.asInterface(service);
        }
    };
    IabHelper.OnConsumeFinishedListener consumeProFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            if (result.isSuccess()) {
                restartApp();
            } else {
                // handle error
            }
        }
    };
    //In app billing consume listener
    IabHelper.QueryInventoryFinishedListener consumeProInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            if (result.isFailure()) {
                // Handle failure
            } else {
                iabHelper.consumeAsync(inventory.getPurchase(UPGRADE_PRO_SKU), consumeProFinishedListener);
            }
        }
    };
    //Current Play Services enable state
    private boolean playServicesEnabled = false;
    //Leaderboard toolbar spinners
    private AppCompatSpinner spinnerSpan;
    private AppCompatSpinner spinnerCollection;
    //In app billing purchase listener
    private IabHelper.QueryInventoryFinishedListener purchaseProInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            if (result.isFailure()) {
                Log.v("TAG", "Error checking inventory: " + result);
                if (UtilsVersion.isPro()) {
                    UtilsVersion.updatePro(false);
                    restartApp();
                }
            } else {
                // does the user have the premium upgrade?
                if (inventory.hasPurchase(UPGRADE_PRO_SKU)) {
                    Log.v("TAG", "onQueryInventoryFinished GOT A RESPONSE YES Premium");
                    if (!UtilsVersion.isPro()) {
                        UtilsVersion.updatePro(true);
                        restartApp();
                    }
                } else {
                    Log.v("TAG", "onQueryInventoryFinished GOT A RESPONSE No Premium");
                    if (UtilsVersion.isPro()) {
                        UtilsVersion.updatePro(false);
                        restartApp();
                    }
                }
            }
        }
    };
    //Ads handling
    private MoPubInterstitial mInterstitial;
    private MoPubRewardedVideoListener rewardedVideoListener = new MoPubRewardedVideoListener() {
        @Override
        public void onRewardedVideoLoadSuccess(@NonNull String adUnitId) {
            rewardAdCached();
        }

        @Override
        public void onRewardedVideoLoadFailure(@NonNull String adUnitId, @NonNull MoPubErrorCode errorCode) {

        }

        @Override
        public void onRewardedVideoStarted(@NonNull String adUnitId) {

        }

        @Override
        public void onRewardedVideoPlaybackError(@NonNull String adUnitId, @NonNull MoPubErrorCode errorCode) {

        }

        @Override
        public void onRewardedVideoClosed(@NonNull String adUnitId) {
            Log.v("Chartboost", "Reward Ad Closed");
            //UtilsDisplay.resetImmersiveMode(GooglePlayActivity.this, true);
            cacheRewardAd();
        }

        @Override
        public void onRewardedVideoCompleted(@NonNull Set<String> adUnitIds, @NonNull MoPubReward reward) {
            if (reward.isSuccessful()) {
                Log.v("Chartboost", "Reward: " + reward);
                rewardAdWatched(reward.getAmount());
                GooglePlay.AdEvent.REWARD_AD_WATCHED.setAmount(reward.getAmount()).post();
            }
        }
    };

    /**
     * @return The app public google from google play dev consol
     */
    @NonNull
    protected abstract String getPublicKey();

    /**
     * @return The bitwise state of google api clients to use
     */
    protected abstract int getGooglePlayClients();

    /**
     * @return The bitwise state of jms api clients to use
     */
    protected abstract int getJMSClients();

    /**
     * @return Chartboost app id
     */
    @Nullable
    protected abstract String getChartboostAppId();

    /**
     * @return Chartboost app Signature
     */
    @Nullable
    protected abstract String getChartboostAppSignature();

    /**
     * @return Native ad ID for small format
     */
    @Nullable
    protected abstract String getMopubNativeAdId();

    /**
     * @return Native ad ID for large (full) format
     */
    @Nullable
    protected abstract String getMopubNativeAdIdFull();

    /**
     * @return Ad ID of the interstitial ad
     */
    @Nullable
    protected abstract String getMopubInterstitialAdId();

    /**
     * @return A ID of the reward video ad
     */
    @Nullable
    protected abstract String getMopubRewardAdId();

    /**
     * Reward ad was watched fully
     *
     * @param reward Reward amount
     */
    protected abstract void rewardAdWatched(int reward);

    /**
     * Reward ad has been cached and is ready to play
     */
    protected abstract void rewardAdCached();

    /**
     * onCreateComplete for all normal onCreate work
     *
     * @param savedInstanceState saved app instance state
     */
    @Override
    @CallSuper
    protected void onCreateComplete(Bundle savedInstanceState) {
        super.onCreateComplete(savedInstanceState);
        //Add all the fragments specific to this library
        addFragment(AchievementFragment.TAG, AchievementFragment.class, AchievementFragment.TAG_MAIN_FRAGMENT);
        addFragment(LeaderboardFragment.TAG, LeaderboardFragment.class, LeaderboardFragment.TAG_MAIN_FRAGMENT);
        addFragment(LeaderboardMetaFragment.TAG, LeaderboardMetaFragment.class, LeaderboardMetaFragment.TAG_MAIN_FRAGMENT);
        addFragment(OnlineLoadGameFragment.TAG, OnlineLoadGameFragment.class, OnlineLoadGameFragment.TAG_MAIN_FRAGMENT);
        addFragment(PlayerPickerFragment.TAG, PlayerPickerFragment.class, PlayerPickerFragment.TAG_MAIN_FRAGMENT);

        dialogBuildManager = new GooglePlayDialogBuildManager();
        activityResultManager = new GooglePlayActivityResultManager();
        dialogBuildManager.attach(this);
        activityResultManager.attach(this);

        //Set ad ids
        initAdIds();
        MoPub.onCreate(this);
        Chartboost.startWithAppId(this, getChartboostAppId(), getChartboostAppSignature());
        Chartboost.onCreate(GooglePlayActivity.this);
        if(jmsHelper == null) {
            getJMSHelper();
        }
        jmsHelper.setup(this);
        //Check if google play services are available
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resultCode == ConnectionResult.SUCCESS) {
            playServicesEnabled = true;
            if (!UtilsAds.isAlreadyRunning()) {
                UtilsAds.onCreate();
            }
            if (!UtilsVersion.isPro()) {
                enableAds();
            } else {
                disableAds();
            }
            startIABHelper();
            if (mHelper == null) {
                getGameHelper();
            }
            mHelper.setup(this);
        } else {
            //Ads still work without google play services but the user cant remove them with an IAP
            enableAds();
        }
        initSpinners();
    }

    @Override
    public void onStart() {
        super.onStart();
        if (playServicesEnabled) {
            mHelper.setConnectOnStart(getPlayGamesEnabledPref());
            mHelper.onStart(this);
            GooglePlayCalls.getInstance().attach(this);
        }
        if(jmsHelper != null) {
            jmsHelper.onStart();
            JMSGamesCalls.getInstance().attach(this);
        }
        MoPub.onStart(this);
        Chartboost.onStart(GooglePlayActivity.this);
    }

    @Override
    public void onResume() {
        super.onResume();
        MoPub.onResume(this);
        Chartboost.onResume(GooglePlayActivity.this);
        cacheRewardAd();
        if (!UtilsVersion.isPro()) {
            cacheInterstitial();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        MoPub.onPause(this);
        Chartboost.onPause(GooglePlayActivity.this);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (playServicesEnabled) {
            mHelper.onStop();
            GooglePlayCalls.getInstance().detach();
        }
        if(jmsHelper != null) {
            jmsHelper.onStop();
            JMSGamesCalls.getInstance().detach();
        }
        MoPub.onStop(this);
        Chartboost.onStop(GooglePlayActivity.this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (playServicesEnabled) {
            if (mService != null) {
                unbindService(mServiceConn);
            }
            if (iabHelper != null) {
                iabHelper.dispose();
            }
            iabHelper = null;
        }
        if (mInterstitial != null) {
            mInterstitial.destroy();
        }
        MoPub.onDestroy(this);
        Chartboost.onDestroy(GooglePlayActivity.this);
        dialogBuildManager.detach();
        activityResultManager.detach();
    }

    @Override
    public void onRestart() {
        super.onRestart();
        Log.v("GooglePlayActivity", "onRestart");
        MoPub.onRestart(this);
    }

    @Override
    public void onBackPressed() {
        if (!Chartboost.onBackPressed()) {
            super.onBackPressed();
            MoPub.onBackPressed(this);
        }
    }

    @Override
    @NonNull
    public final GameHelper getGameHelper() {
        if (mHelper == null) {
            mHelper = new GameHelper(this, getGooglePlayClients());
            mHelper.enableDebugLog(mDebugLog);
        }
        return mHelper;
    }

    @Override
    @NonNull
    public final JMSHelper getJMSHelper() {
        if (jmsHelper == null) {
            jmsHelper = new JMSHelper(getJMSClients());
        }
        return jmsHelper;
    }

    /**
     * Setup the spinners for use on the leaderboards. They are hidden unless the leaderboard displays them.
     */
    private void initSpinners() {
        ActionBar actionBar = getSupportActionBar();
        if (actionBar == null) {
            return;
        }
        spinnerSpan = (AppCompatSpinner) findViewById(R.id.spinner_left);
        spinnerCollection = (AppCompatSpinner) findViewById(R.id.spinner_right);
        final ArrayAdapter spinnerTimesAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.leaderboard_span, R.layout.simple_spinner_title_item);
        final ArrayAdapter spinnerCollectionAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.leaderboard_collection, R.layout.simple_spinner_title_item);
        spinnerTimesAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        spinnerCollectionAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        spinnerSpan.setAdapter(spinnerTimesAdapter);
        spinnerCollection.setAdapter(spinnerCollectionAdapter);
        spinnerSpan.setSelection(GooglePlayCalls.getInstance().getLeaderboardSpan().ordinal(), false);
        spinnerCollection.setSelection(GooglePlayCalls.getInstance().getLeaderboardCollection().ordinal(), false);
    }

    /**
     * Update the visibility status of the spinners
     *
     * @param visible True for visible, false for hidden
     */
    @Override
    public void setSpinnerVisibility(boolean visible) {
        if (visible) {
            spinnerSpan.setVisibility(View.VISIBLE);
            spinnerCollection.setVisibility(View.VISIBLE);
            spinnerSpan.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    switch (spinnerSpan.getSelectedItemPosition()) {
                        case 0:
                            GooglePlayCalls.getInstance().setLeaderboardSpan(GooglePlay.Span.DAILY);
                            break;
                        case 1:
                            GooglePlayCalls.getInstance().setLeaderboardSpan(GooglePlay.Span.WEEKLY);
                            break;
                        case 2:
                            GooglePlayCalls.getInstance().setLeaderboardSpan(GooglePlay.Span.ALL_TIME);
                            break;
                        default:
                            GooglePlayCalls.getInstance().setLeaderboardSpan(GooglePlay.Span.ALL_TIME);
                            break;
                    }
                    Bus.postEnum(GooglePlay.GooglePlayEvent.LEADERBOARD_SPINNER_CHANGE);
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
            spinnerCollection.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    switch (spinnerCollection.getSelectedItemPosition()) {
                        case 0:
                            GooglePlayCalls.getInstance().setLeaderboardCollection(GooglePlay.Collection.SOCIAL);
                            break;
                        case 1:
                            GooglePlayCalls.getInstance().setLeaderboardCollection(GooglePlay.Collection.PUBLIC);
                            break;
                        default:
                            GooglePlayCalls.getInstance().setLeaderboardCollection(GooglePlay.Collection.PUBLIC);
                            break;
                    }
                    Bus.postEnum(GooglePlay.GooglePlayEvent.LEADERBOARD_SPINNER_CHANGE);
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        } else {
            spinnerSpan.setOnItemSelectedListener(null);
            spinnerCollection.setOnItemSelectedListener(null);
            spinnerSpan.setVisibility(View.GONE);
            spinnerCollection.setVisibility(View.GONE);
        }
    }

    /**
     * Setup in app billing and upon success query if the user purchased the pro upgrade
     */
    private void startIABHelper() {
        //Start the IAP service connection
        Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
        serviceIntent.setPackage("com.android.vending");
        bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
        // compute your public key and store it in base64EncodedPublicKey
        iabHelper = new IabHelper(this, getPublicKey());
        iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                if (!result.isSuccess()) {
                    Log.d("BaseAdLauncherActivity", "Problem setting up In-app Billing: " + result);
                    iabHelper = null;
                    return;
                }
                Log.d("BaseAdLauncherActivity", "In app billing is setup and working: " + result);
                iabHelper.queryInventoryAsync(false, purchaseProInventoryListener);
            }
        });
    }

    /**
     * Set all the ad ids. Some (or all) of these may be null
     */
    private void initAdIds() {
        UtilsAds.setMopubNativeAdId(getMopubNativeAdId());
        UtilsAds.setMopubNativeAdIdFull(getMopubNativeAdIdFull());
        UtilsAds.setMopubInterstitialAdId(getMopubInterstitialAdId());
        UtilsAds.setMopubRewardAdId(getMopubRewardAdId());
    }

    /**
     * Enable display of ads in app
     */
    private void enableAds() {
        Log.v("BaseAdLauncherActivity", "Showing ads");
        initInterstitialAd();
        initRewardVideoAd();
    }

    /**
     * Disable display of ads in app.
     * Reward video ads are enabled anyway.
     */
    private void disableAds() {
        Log.v("BaseAdLauncherActivity", "Hiding ads");
        initRewardVideoAd();
    }

    /**
     * Init the reward video ad
     */
    private void initRewardVideoAd() {
        if (UtilsAds.getMopubRewardAdId() != null) {
            MoPub.initializeRewardedVideo(this);
            MoPub.setRewardedVideoListener(rewardedVideoListener);
        }
    }

    /**
     * Init and cache the interstitial ad
     */
    private void initInterstitialAd() {
        if (UtilsAds.getMopubInterstitialAdId() != null) {
            mInterstitial = new MoPubInterstitial(this, UtilsAds.getMopubInterstitialAdId());
            mInterstitial.setInterstitialAdListener(this);
            cacheInterstitial();
        }
    }

    /**
     * Show the interstitial ad if we have one loaded.
     * Make no attempt to retry.
     */
    public final void showInterstitialAd() {
        if (!UtilsAds.allowInterstitial()) {
            Log.v("BaseAdLauncherActivity", "Not enough time since last shown an ad");
            return;
        }
        Log.v("BaseAdLauncherActivity", "Requested interstitial");
        if (hasCachedInterstitial()) {
            mInterstitial.show();
            UtilsAds.updateAdShowTimeStamp();
        }
    }

    /**
     * @return True if we have an interstitial cached and ready.
     */
    private boolean hasCachedInterstitial() {
        return mInterstitial.isReady();
    }

    /**
     * Begin caching an interstitial ad for use
     */
    private void cacheInterstitial() {
        mInterstitial.load();
    }

    /**
     * Begin caching a reward ad for use.
     *
     * @return true if caching has begun. false if error.
     */
    private boolean cacheRewardAd() {
        String adId = UtilsAds.getMopubRewardAdId();
        if (adId != null) {
            MoPub.loadRewardedVideo(adId);
            return true;
        }
        return false;
    }

    /**
     * @return True if the reward ad is cached and ready.
     */
    private boolean hasCachedRewardAd() {
        String adId = UtilsAds.getMopubRewardAdId();
        return adId != null && MoPub.hasRewardedVideo(adId);
    }

    /**
     * Shows the reward ad if it is ready/
     *
     * @return True if ad is displayed. False if it is not ready.
     */
    public final boolean showRewardAd() {
        String adId = UtilsAds.getMopubRewardAdId();
        if (hasCachedRewardAd() && adId != null) {
            Log.v("GooglePlayActivity", "Cached: Showing Reward Ad");
            MoPub.showRewardedVideo(adId);
            return true;
        } else {
            new SnackbarRequest(getString(R.string.ad_unavailable), SnackbarRequest.SnackBarDuration.LONG).execute();
        }
        Log.v("GooglePlayActivity", "NOT Cached: Skipping Reward Ad");
        return false;
    }

    /**
     * Interstitial ad has been loaded
     *
     * @param interstitial Interstitial ad
     */
    @Override
    public void onInterstitialLoaded(@NonNull MoPubInterstitial interstitial) {

    }

    /**
     * Failed to display interstitial ad
     *
     * @param interstitial Interstitial ad
     * @param errorCode    Error Code
     */
    @Override
    public void onInterstitialFailed(@NonNull MoPubInterstitial interstitial, @NonNull MoPubErrorCode errorCode) {

    }

    /**
     * Interstitial ad shown
     *
     * @param interstitial Interstitial ad
     */
    @Override
    public void onInterstitialShown(@NonNull MoPubInterstitial interstitial) {

    }

    /**
     * Interstitial ad clicked
     *
     * @param interstitial Interstitial ad
     */
    @Override
    public void onInterstitialClicked(@NonNull MoPubInterstitial interstitial) {

    }

    /**
     * Interstitial ad dismissed
     *
     * @param interstitial Interstitial ad
     */
    @Override
    public void onInterstitialDismissed(@NonNull MoPubInterstitial interstitial) {
        cacheInterstitial();
    }

    /**
     * Start the purchase ad removal
     */
    public final void purchaseProUpgrade() {
        if (UtilsVersion.isPro()) {
            new SnackbarRequest(AppBase.getContext().getString(R.string.pro_unlocked), SnackbarRequest.SnackBarDuration.SHORT).execute();
            return;
        }
        if (iabHelper == null) {
            new SnackbarRequest(AppBase.getContext().getString(R.string.error), SnackbarRequest.SnackBarDuration.SHORT).execute();
            return;
        }
        AutoLockOrientation.enableAutoLock(this);
        iabHelper.launchPurchaseFlow(this, UPGRADE_PRO_SKU, 10001, new IabHelper.OnIabPurchaseFinishedListener() {
            public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
                if (result.isSuccess() && purchase.getSku().equals(UPGRADE_PRO_SKU) && purchase.getDeveloperPayload().equals("REMOVE_ADS_PURCHASE_TOKEN")) {
                    Prefs.putString(getResources().getString(R.string.settings_pref), "ORDERID", purchase.getOrderId());
                    new SnackbarRequest(AppBase.getContext().getString(R.string.ads_removed), SnackbarRequest.SnackBarDuration.SHORT).execute();
                    UtilsVersion.updatePro(true);
                    restartApp();
                } else {
                    // Handle error
                    new SnackbarRequest(AppBase.getContext().getString(R.string.failed), SnackbarRequest.SnackBarDuration.SHORT).execute();
                }
                AutoLockOrientation.disableAutoLock(GooglePlayActivity.this);
            }
        }, "REMOVE_ADS_PURCHASE_TOKEN");
    }

    /**
     * Use With CARE!
     * This will reset the pro upgrade and put the user back on the free tier.
     * It cannot be undone without purchasing pro again.
     */
    public final void consumeProUpgrade() {
        if (iabHelper != null) {
            iabHelper.queryInventoryAsync(consumeProInventoryListener);
        }
    }

    /**
     * Override the normal pro upgrade handler to kick off the in app purchase
     */
    @Override
    public void upgradeToPro() {
        if (UtilsVersion.isPro()) {
            new SnackbarRequest(AppBase.getContext().getString(com.jamesmorrisstudios.appbaselibrary.R.string.pro_unlocked), SnackbarRequest.SnackBarDuration.SHORT).execute();
        } else {
            purchaseProUpgrade();
        }
    }

    /**
     * Checks if google play and google play games are signed in and ready to use
     *
     * @param tryToSignIn         True to attempt sign in if not signed in already.
     * @param showStatusOnFailure True to display an error code if Google Play Services are unavailable.
     * @return True if ready, false otherwise
     */
    public final boolean isGooglePlayReady(boolean tryToSignIn, boolean showStatusOnFailure) {
        if (playServicesEnabled) {
            if(isSignedIn()) {
                return true;
            }
            getGameHelper();
            beginUserInitiatedSignIn();
        } else if (showStatusOnFailure) {
            new SnackbarRequest(AppBase.getContext().getString(R.string.requires_google_play), SnackbarRequest.SnackBarDuration.SHORT).execute();
        }
        return false;
    }

    /**
     * @return True if the user has signed into Google Play Games in the past.
     */
    private boolean getPlayGamesEnabledPref() {
        return Prefs.getBoolean(getString(R.string.settings_pref), "PlayGamesEnabled", true);
    }

    /**
     * @param playGamesEnabled True to enable Google Play Games
     */
    private void setPlayGamesEnabledPref(boolean playGamesEnabled) {
        Prefs.putBoolean(getString(R.string.settings_pref), "PlayGamesEnabled", playGamesEnabled);
    }

    /**
     * Sign in to Google Play Games failed.
     * Sets the pref to prevent retrying.
     */
    @Override
    public final void onSignInFailed() {
        Log.v("Activity", "Sign in failed: ");// + GooglePlay.getInstance().getSignInError().getActivityResultCode()+" "+GooglePlay.getInstance().getSignInError().getServiceErrorCode());
        Bus.postEnum(GooglePlay.GooglePlayEvent.SIGN_IN_FAIL);
        setPlayGamesEnabledPref(false);
    }

    /**
     * Sign in to Google Play Games succeeded.
     * Set the pref to auto sign in in the future.
     */
    @Override
    public final void onSignInSucceeded() {
        Log.v("Activity", "Sign in Succeeded");
        Bus.postEnum(GooglePlay.GooglePlayEvent.SIGN_IN_SUCCESS);
        View view = findViewById(R.id.coordinatorLayout);
        if(view != null) {
            Games.setViewForPopups(getApiClient(), view);
        }
        setPlayGamesEnabledPref(true);
    }

    public final void onJMSSignInFailed() {
        //TODO
    }

    /** Called when sign-in succeeds. */
    public final void onJMSSignInSucceeded() {
        //TODO
    }

    /**
     * Activity result handler.
     *
     * @param requestCode Request code
     * @param resultCode  Result code
     * @param data        Intent Data
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //Check if the iabHelper (in app billing) consumes the result.
        if (iabHelper != null) {
            iabHelper.handleActivityResult(requestCode, resultCode, data);
        }
        //Check if the google play login uses the result
        if(mHelper != null) {
            mHelper.onActivityResult(requestCode, resultCode, data);
        }
        //Check for page callbacks and results. TODO These will be removed once native pages have been created.
        if (requestCode == RC_LOOK_AT_MATCHES) {
            if (data == null || resultCode != Activity.RESULT_OK) {
                Bus.postEnum(GooglePlay.GooglePlayEvent.SELECT_LOAD_MATCH_ONLINE_FAIL);
            } else {
                loadMatchOnline((TurnBasedMatch) data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH));
            }
        } else if (requestCode >= RC_SELECT_PLAYERS && requestCode <= RC_SELECT_PLAYERS + 100) {
            if (data == null || resultCode != Activity.RESULT_OK) {
                Bus.postEnum(GooglePlay.GooglePlayEvent.SELECT_PLAYERS_ONLINE_FAIL);
            } else {
                selectPlayersOnline(data, requestCode - RC_SELECT_PLAYERS);
            }
        }
    }

    //TODO
    private void selectPlayersOnline(@NonNull Intent data, int variant) {
        Log.v("BaseActivity", "Select players online");

        // get the invitee list
        final ArrayList<String> invitees = data.getStringArrayListExtra(Games.EXTRA_PLAYER_IDS);

        // get automatch criteria
        Bundle autoMatchCriteria = null;

        int minAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);
        int maxAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);

        if (minAutoMatchPlayers > 0) {
            autoMatchCriteria = RoomConfig.createAutoMatchCriteria(minAutoMatchPlayers, maxAutoMatchPlayers, 0);
        } else {
            autoMatchCriteria = null;
        }

        TurnBasedMatchConfig matchConfig = TurnBasedMatchConfig.builder()
                .setVariant(variant)
                .addInvitedPlayers(invitees)
                .setAutoMatchCriteria(autoMatchCriteria).build();

        GooglePlayCalls.getInstance().startMatchOnline(matchConfig);
    }

    //TODO
    private void loadMatchOnline(@Nullable TurnBasedMatch match) {
        if (match != null) {
            if (match.getData() == null) {
                //This is a rematch
                Log.v("Activity", "Load online Rematch");
            } else {
                //We are loading an existing match
                Log.v("Activity", "Load online Existing");
            }
        } else {
            Bus.postEnum(GooglePlay.GooglePlayEvent.SELECT_LOAD_MATCH_ONLINE_FAIL);
        }
    }

    /**
     * Loads the leaderboard meta fragment into the main view
     */
    public final boolean loadLeaderboardMetaFragment(String[] leaderboardIds) {
        GooglePlayCalls.getInstance().clearLeaderboardsMetaCache();
        GooglePlayCalls.getInstance().clearLeaderboardsCache();
        if (isGooglePlayReady(true, true)) {
            Bundle bundle = new Bundle();
            bundle.putStringArray("leaderboardIds", leaderboardIds);
            loadFragment(LeaderboardMetaFragment.TAG, bundle);
            return true;
        }
        return false;
    }

    /**
     * Loads the leaderboard fragment into the main view
     */
    @Override
    public final boolean loadLeaderboardFragment(String leaderboardId) {
        GooglePlayCalls.getInstance().clearLeaderboardsCache();
        if (isGooglePlayReady(true, true)) {
            Bundle bundle = new Bundle();
            bundle.putString("leaderboardId", leaderboardId);
            loadFragment(LeaderboardFragment.TAG, bundle);
            return true;
        }
        return false;
    }

    /**
     * Loads the achievements fragment into the main view
     */
    public final boolean loadAchievementFragment(String[] achievementIds) {
        GooglePlayCalls.getInstance().clearAchievementsCache();
        if (isGooglePlayReady(true, true)) {
            Bundle bundle = new Bundle();
            bundle.putStringArray("achievementIds", achievementIds);
            loadFragment(AchievementFragment.TAG, bundle);
            return true;
        }
        return false;
    }

    /**
     * Loads the online load game fragment into the main view
     */
    public final boolean loadOnlineLoadGameFragment() {
        if (isGooglePlayReady(true, true)) {
            loadFragment(OnlineLoadGameFragment.TAG);
            //startActivityForResult(Games.TurnBasedMultiplayer.getInboxIntent(GooglePlay.getInstance().getApiClient()), RC_LOOK_AT_MATCHES);
            return true;
        }
        return false;
    }

    //Variant max of 100 (normally 1)
    public final boolean loadPlayerPickerFragment(int minPlayers, int maxPlayers, boolean allowAutomatch, int variant) {
        if (isGooglePlayReady(true, true)) {
            //startActivityForResult(Games.TurnBasedMultiplayer.getSelectOpponentsIntent(GooglePlay.getInstance().getApiClient(), minPlayers, maxPlayers, allowAutomatch), RC_SELECT_PLAYERS + variant);
            loadFragment(PlayerPickerFragment.TAG);
            return true;
        }
        return false;
    }

    public final boolean loadOfflineInboxFragment() {
        if (isGooglePlayReady(true, true)) {
            //startActivityForResult(Games.Snapshots.getSelectSnapshotIntent(GooglePlay.getInstance().getApiClient(), getString(R.string.select_save), false, true, Snapshots.DISPLAY_LIMIT_NONE), RC_LOOK_AT_SNAPSHOTS);
            return true;
        }
        return false;
    }

    @CallSuper
    @Override
    public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
        if(item.getItemId() == R.id.navigation_remove_ads) {
            item.setChecked(false);
            if(UtilsVersion.isPro()) {
                new SnackbarRequest(getString(R.string.ads_removed), SnackbarRequest.SnackBarDuration.SHORT).execute();
            } else {
                upgradeToPro();
            }
        } else if(item.getItemId() == R.id.navigation_sign_in) {
            item.setChecked(false);
            Log.v("GooglePlayActivity", "Sign In");
            beginUserInitiatedSignIn();
        } else if(item.getItemId() == R.id.navigation_sign_out) {
            item.setChecked(false);
            Log.v("GooglePlayActivity", "Sign Out");
            if(isGooglePlayReady(false, false)) {
                signOut();
            }
        } else if(item.getItemId() == R.id.navigation_achievements_all) {
            item.setChecked(false);
            if(isGooglePlayReady(true, true)) {
                loadAchievementFragment(getResources().getStringArray(R.array.achievements_all));
            }
        } else if(item.getItemId() == R.id.navigation_achievements_offline) {
            item.setChecked(false);
            if(isGooglePlayReady(true, true)) {
                loadAchievementFragment(getResources().getStringArray(R.array.achievements_offline));
            }
        } else if(item.getItemId() == R.id.navigation_achievements_online) {
            item.setChecked(false);
            if(isGooglePlayReady(true, true)) {
                loadAchievementFragment(getResources().getStringArray(R.array.achievements_online));
            }
        } else if(item.getItemId() == R.id.navigation_leaderboards_all) {
            item.setChecked(false);
            if(isGooglePlayReady(true, true)) {
                loadLeaderboardMetaFragment(getResources().getStringArray(R.array.leaderboards_all));
            }
        } else if(item.getItemId() == R.id.navigation_leaderboards_offline) {
            item.setChecked(false);
            if(isGooglePlayReady(true, true)) {
                loadLeaderboardMetaFragment(getResources().getStringArray(R.array.leaderboards_offline));
            }
        } else if(item.getItemId() == R.id.navigation_leaderboards_online) {
            item.setChecked(false);
            if(isGooglePlayReady(true, true)) {
                loadLeaderboardMetaFragment(getResources().getStringArray(R.array.leaderboards_online));
            }
        }
        return super.onNavigationItemSelected(item);
    }

    protected GoogleApiClient getApiClient() {
        return mHelper.getApiClient();
    }

    protected boolean isSignedIn() {
        return mHelper.isSignedIn();
    }

    protected void beginUserInitiatedSignIn() {
        mHelper.beginUserInitiatedSignIn();
    }

    protected void signOut() {
        mHelper.signOut();
        new SnackbarRequest(AppBase.getContext().getString(R.string.signed_out), SnackbarRequest.SnackBarDuration.SHORT).execute();
        GooglePlay.GooglePlayEvent.SIGN_OUT.post();
    }

    protected void showAlert(String message) {
        mHelper.makeSimpleDialog(message).show();
    }

    protected void showAlert(String title, String message) {
        mHelper.makeSimpleDialog(title, message).show();
    }

    protected void enableDebugLog(boolean enabled) {
        mDebugLog = true;
        if (mHelper != null) {
            mHelper.enableDebugLog(enabled);
        }
    }

    @Deprecated
    protected void enableDebugLog(boolean enabled, String tag) {
        Log.w("GooglePlayActivity", "BaseGameActivity.enabledDebugLog(bool,String) is " +
                "deprecated. Use enableDebugLog(boolean)");
        enableDebugLog(enabled);
    }

    protected String getInvitationId() {
        return mHelper.getInvitationId();
    }

    protected void reconnectClient() {
        mHelper.reconnectClient();
    }

    protected boolean hasSignInError() {
        return mHelper.hasSignInError();
    }

    protected GameHelper.SignInFailureReason getSignInError() {
        return mHelper.getSignInError();
    }

}


Digital Paint-in of missing elements or paint-out of unwanted elements Wire/Rig Removal.
Will ask you about the test you did on site.
According to the seniority the test will be complex. Basic questions like what kind of layers are you aware of and how you can use it in the composition?
General questions on job scope.
Basic Comp Questions and Few about color theory.
I replied to almost all the question apart from 1. and for that question i replied "Honestly I dont have idea about that"


Americans horrified by the rise of Trump look for reassurance in polls showing how unpopular the billionaire property magnate is among all registered voters. They might also breath easier because of a poll showing Trump's "net favourability" dead last among all of this season's candidates.
This salve doesn't address the problem and won't prevent a Trump-like occupation of the White House – if not in 2017 then sometime in the foreseeable future – unless these voters see Trump's ascendancy not as some spasm of irrationality but as an ideological revolution for a wide swathe of working, middle-class voters.
This is a significant voting bloc. For the sake of clarity, let's define this group as those who use at least half of their paycheques to feed themselves (and their children) and keep a roof over their heads.
Jesus Christ isn't coming to their rescue any time soon. This explains the perpetual second-place status of God squad darling Ted Cruz.
While many Republicans wring their hands over how their coalition of laissez-faire tax-cut fetishists, populists, and Christian fundamentalists could have split apart, they might instead give thanks for how long this odd combination held together.
For working, middle-class Americans feeling left out in the wilderness by "establishment" Republicans, the destination should be the Democratic Party, which has historically stood for unions, regulation of industry, and protection of social benefits.
The zeal for this journey, however, is undercut by several factors. Labour unions? They barely exist anymore in the U.S. Democrats share as much responsibility as Republicans for the deregulation that paved the way to the subprime mortgages that sparked the financial crisis of 2008. And social benefits? Not much has changed on that front since Social Security in the 1930s and Medicare in the 1960s. There are some subsidies available as part of the health care overhaul established by Barack Obama, also known as Obamacare, but the program runs on a for-profit basis by American insurance companies, the biggest beneficiaries of this initiative.
That leaves us with mistrust towards Democratic front-runner Hillary Clinton as a key factor in Trump's popularity among America's working middle-income earners. It remains to be seen how much blame for the 2012 Benghazi terrorist attacks that killed U.S. Ambassador Christopher Stevens can be attributed to Clinton, who was Secretary of State at the time. There's also the email scandal, which, to date, hasn't turned up anything more than a disagreement over what should be considered classified in a post-9/11 world.
Much of the mistrust of Clinton stems from the former first lady's friendly ties to Wall Street, where brokers hiding toxic assets in otherwise sensible investment instruments sparked the 2008 crisis and sent the U.S. economy into a tailspin. Many thrown out of a job as financial markets seized up remain in the same position. Meanwhile, those supported by trust funds or capital gains on their investment portfolios – income that's taxed at a lower rate than the levy on regular wages – live as though nothing happened in 2008 because the markets have largely recovered.
As a central figure in Democratic Party politics for decades, Clinton has traded many favours, but she has fewer glaring contradictions than Trump, who hires cheap foreign labour and manufactures his products in China. Watching Trump bow his head while sitting in a church pew should make all but those with the strongest stomachs wretch.
It would be easy to blame the Democrats' failure to bring Trump's supporters into the fold on the Republican PR machine, which – aided and abetted by Fox News – has systematically weaponized the words "liberal," "feminist," "gay," "black," "Hispanic," "foreigner," and "government." But this explanation doesn't take into account the extent to which technological changes are turning the U.S. into a "gig economy," where key elements of the American dream, such as home ownership and socioeconomic upward mobility, are out of reach. The belief that these things are always a possibility, always just around the corner, had maintained working middle-class voter support for Republicans.
They've wised up, but only to a certain extent because Trump, who characterizes a $1 million-loan from his dad in 1968 as "small", won't change anything for them.
The Democratic Party simply isn't drawing enough voters who feel insecure about free trade initiatives, particularly in the form of the Trans-Pacific Partnership, and the technological changes that make people redundant. The option of Bernie Sanders, who's proposing to mount a more serious challenge to the status quo, isn't helping because these voters see the party machinery throwing support behind Clinton.
By rejecting the Republican Party's traditional prescriptions, and by cheering Trump's hatred of foreigners and hostility towards free trade instead of the Democratic Party's options, many middle-income Americans appear to have accepted that the establishments of both parties have snuffed out the American dream.
Trump's supporters are willing to scorch the earth to clear away what remains of that faith. They prefer to see what sprouts when the smoke clears.


text:
What Happens When Women and Girls Seek Help in Emergencies? The Awful Truth About Violence
When people seek help in emergencies, we like to think that they will receive that help. But the awful truth is that for too many women and girls, what they are met with is violence - and then silence. Finally the world is starting to talk about it. And there is the hope.
Geeta Bandi-Phillips
Director of Advocacy and External Engagement at World Vision
13/11/2013 11:11am GMT | Updated January 23, 2014
As war ravages Syria, hunger stalks central Africa, and a Super Typhoon hits East Asia, the international community is working to assist those at risk. But alongside the challenges everyone talks about - like lack of access to food and water - there is another peril faced women and girls in emergencies, one that has been hidden from public conversation: the threat of sexual and gender violence. This week, the taboo is finally being broken as leaders meet in London for the High Level Event on Violence Against Women and Girls in Emergencies. It is crucial that leaders talk about this scourge; it is even more vital that they hear from those who have suffered it.
The stories that young girls and women have told me, on visits to Cambodia, Sri Lanka and Nepal, will haunt me forever. The wide-scale, brutal, sexual and gender based violence that has taken place in natural disasters and conflicts across the world, the lack of redress, and the lack of public acknowledgement, is a challenge to us all. We like to think we know how humans respond to humans in need. We don't like to think it can be like this.
Eighteen year old Marie (not her real name - she does not want her real name to be known), lost her home in the great earthquake that rocked Haiti, and fled to Gerald Batille Camp. One day, taking out the trash, she found herself surrounded by six men. They dragged her to a nearby house; they held a gun at her; they covered her mouth; then all six men raped her. A few days later, she gathered her courage to see a doctor - alone, so that no one else would find out. Later, she was able to tell her aunt and mother. She has never reported the rape to the police. She doesn't think they would do anything.
In the Syrian conflict, sexual and gender based violence is playing an increasingly prominent role as a tactic of war. It takes place during armed raids, at checkpoints, in detention facilities and even at schools. Sexual violence is one of the most under-reported forms of violence against children there. The most shocking revelation for me was that more than 80 per cent of respondents of our research said they would not know where to seek help for sexual assault. To help keep women and girls safe, World Vision is setting up Child-Friendly Spaces, with professional counsellors who help vulnerable children deal with their situation. David Thomson, World Vision's Director of Policy and Programmes told me, "women and girls are the most vulnerable group during an emergency and the long-term impact of trauma can be huge and devastating if not addressed. We use Child Friendly Spaces to support and protect children, give them somewhere to play, and remember what it's like to be a child again after an emergency."
When people seek help in emergencies, we like to think that they will receive that help. But the awful truth is that for too many women and girls, what they are met with is violence - and then silence. Finally the world is starting to talk about it. And there is the hope. As William Wilberforce said two centuries ago, after sharing with leaders the brutal details of slavery: "Having heard all of this you may choose to look the other way, but you can never again say that you did not know." Now the secret is no longer secret, what will we do?
SyriaviolenceconflictWomenvawg

redpajama_set_name: RedPajamaCommonCrawl


text:
IVF Gender Selection: The Pros, Cons, & Risks You Need To Know
By Alex Robles MD / November 15, 2021 November 15, 2021
Gender selection is an interesting and controversial topic in the field of reproductive medicine.
In this post, you'll learn:
How gender selection is possible with in vitro fertilization
The process, methods, and success rates of gender selection protocols
The pros and cons of the procedures
Although I am a physician by profession, I am not YOUR physician. All content and information on this website are for informational and educational purposes only. It does not constitute medical advice and does not establish any kind of doctor-client relationship by your use of this website. Although I strive to provide accurate general information, the information presented here is not intended for the prevention or treatment of infertility and it is not a substitute for medical or professional advice. You should not rely solely on this information. Always consult your physician in the area for your particular needs and circumstances prior to making any decisions whatsoever. Those who do not seek counsel from the appropriate health care authority assume the liability for any damage, loss, or injury which may occur.
Is gender selection possible in IVF?
Gender selection is possible through IVF and preimplantation genetic testing, a procedure that can determine the chromosomal makeup of an embryo.
It is essential to understand that the IVF process does not modify or change the sex of the embryos. IVF with preimplantation genetic testing simply allows us to know the sex of an embryo before implantation.
In other words, you cannot pick the gender of your baby, you can only transfer what you have available.
If you only make two embryos, and both are males, you only have male embryos to transfer.
Is gender selection legal?
In the United States, there are no state laws to prohibit the practice of IVF for gender selection.
With that said, gender selection is a topic of ethical concern, as depicted by this committee opinion by the American Society for Reproductive Medicine.
As a result, some fertility clinics may not allow you to do preimplantation genetic testing without medical reasons.
How do you determine the gender of an embryo?
The gender selection process requires several steps:
Controlled ovarian stimulation with daily gonadotropin injections
An egg retrieval (anesthesia procedure)
Fertilization of your eggs with the desired sperm
Allowing the fertilized eggs to grow and develop in the IVF laboratory for 5-7 days
Biopsying any resulting embryos that make it to the blastocyst stage
Freezing the embryos while you await the results of the biopsy
Thawing and transferring the chosen embryo back into your uterus at a later time.
Of note, the embryo biopsy is meant to screen for chromosomal genetic disorders (like Down syndrome).
It just so happens that this test can also determine the gender of the embryo by looking at the sex chromosomes. Two X chromosomes indicate female (XX), and one X and one Y chromosome indicate a male (XY).
How accurate is gender selection in IVF?
With the latest technology, we can achieve ~99% accuracy in determining gender for embryos.
What are the risks of IVF gender selection?
For most couples who choose to undergo gender selection with IVF, the procedure is very safe and effective. However, all medical procedures do have some risks.
The risks of the procedure are related to the biopsy itself and the results it can provide.
Let's go over these in more detail.
The Biopsy Procedure
At present, there doesn't appear to be any significant detrimental effects on a developing embryo if the biopsy is done on a blastocyst-stage embryo.
This is particularly true because the biopsy is taken from the trophectoderm, which are the cells that will become the placenta and not the embryo.
However, there does appear to be an increased risk of conditions that increase your blood pressure in pregnancy, which seem to originate from the placenta.
In addition, there is a possibility of the biopsy damaging the embryo if too large of a sample is removed.
While these data are reassuring, we cannot conclusively say that embryo biopsy has no long-term effects.
There simply hasn't been enough time or studies to know for certain.
I go over more details in my post on The Embryo Biopsy: Risks, Benefits, & Alternatives.
The Results of The Biopsy
The second risk of gender selection relates to the results of the biopsy.
Remember, this procedure is designed to look for genetic abnormalities in the embryo.
Errors in the interpretation of the genetic results can occur, especially since we are only biopsying the trophectoderm cells and not the cells that will make the embryo. False positives and false negatives are reported to be approximately 4%.
As a result, there is a slight chance that you may get an abnormal genetic result, despite the embryo being the gender you desire.
Freezing and Warming of The Embryos
Lastly, there is a small risk that an embryo will not survive the warming (aka thawing) process after it is frozen.
Thankfully, over >90% of embryos will survive a freeze/thaw cycle.
IVF gender selection pros and cons
Next, let's go over some pros and cons of knowing the gender of an embryo before you transfer it.
Pros of Gender Selection
Family balancing
Decreased risk of passing on an X-linked genetic disorder
Knowing the gender of your embryo can be helpful if you desire to have a son or a daughter and in a specific order.
While there is no medical reason to choose one sex over another, many parents strongly prefer one gender to balance their family for personal reasons.
Secondly, knowing the gender of your embryo is helpful if you are at risk of passing an X-linked genetic disorder.
These gender-specific genetic abnormalities tend to affect males more aggressively (or exclusively). Common examples include:
Duchenne's muscular dystrophy
Hemophilia A and Hemophilia B
Red-green color blindness
As such, you can choose to transfer a female embryo (if available) to decrease your risk of having a child with the disorder.
Cons of Gender Selection
Discovering that you may not be able to use the embryos you want (due to a chromosomal abnormality)
Disappointment if your embryo is not the gender you desire
Decision over what to do with unwanted or unused embryos
Requires embryo biopsy
Delays pregnancy a bit as you await the results
Disappointment in results
Don't forget, the gender of the embryo is already determined. After a PGT biopsy, it is possible not to have any embryos of your desired sex, or the embryo that is the preferred sex is chromosomally abnormal.
The image below shows a genetic biopsy result of a male embryo (XY) but with a genetic abnormality (three copies of chromosome 21).
If you happen to make one or more embryos of the undesired sex, you will have to decide what you would like to do with them, which can be an ethical issue.
Options include: using the embryos, discarding the embryos, anonymous donation to another couple, or donation for research.
Since the advent of PGT, it appears that PGT is skewing the natural sex ratio towards male children.
Gender selection may be inadvertently devaluing perfectly healthy female embryos.
Embryo Biopsy Risks
In general, the embryo biopsy is considered a fairly safe procedure. But at this time, there isn't enough data to conclusively say that there are no long-term impacts to the biopsy and embryo freezing.
Lastly, PGT will add significant costs to your IVF cycle. On top of the biopsy and the interpretation of those results, you will also need to undergo a frozen embryo transfer cycle.
All of which will add time and costs to the process.
With that said, you will likely need to freeze embryos anyway if you have generated more than one embryo suitable for transfer.
How much does gender selection with IVF cost?
The cost of biopsying your embryos and analyzing the genetic information may add an additional $3000-5000 on top of the IVF treatment cycle (which can be $15,000-$20,000).
In addition, you will then need to undergo a frozen embryo transfer cycle (in which the frozen embryos are warmed and then transferred back into your uterus). Depending on your fertility clinic and insurance coverage, this may cost you an additional $5000 or more as well.
Every clinic is different. Be sure to speak with your healthcare providers to learn what your particular costs may be.
Are IVF babies more likely to be boys or girls?
Interestingly, studies show that you are more likely to have a boy (52-55%) if you do an IVF cycle with conventional insemination (i.e. putting the egg together in a dish with sperm).
On the other hand, some studies show that ICSI cycles (intracytoplasmic sperm injection- where a single sperm is injected directly into the egg) are more likely to yield a female.
Other studies simply show a slightly higher percentage of male embryos, regardless of the fertilization method used.
Can you guarantee a boy with IVF?
Unfortunately, there is no way to guarantee a baby of a particular gender using IVF and PGT.
Even if you are willing to undergo the embryo biopsy only to determine the gender, there is still a ~50% chance of getting an embryo of the desired gender.
How common is gender selection?
There is no data to know how often people do IVF simply for the sole purpose of gender selection.
Many IVF patients will do PGT-A to avoid transferring an embryo with chromosomal abnormalities and elect to know the gender of the embryos as a by-product.
What is the most reliable method of gender selection?
The most reliable method of gender selection is IVF with preimplantation genetic testing. Success rates of determining the gender are close to 100%.
There is another method known as sperm sorting- in which a device can separate sperm that contain the X chromosome and sperm that have the Y chromosome. As such, you can use only sperm with the desired sex chromosome.
Per published reports, it is approximately 70-85% accurate.
This technology is NOT widely available, as its only purpose is manipulating sperm for a preferred gender.
Can you tell if an embryo is a boy or girl?
The only way to determine the gender of an embryo is through PGT.
There are no discernable features of a blastocyst embryo that tell you if it is a boy or a girl.
Final Words on Sex Selection
While controversial with many ethical implications, gender selection with assisted reproductive technology is made possible through the use of preimplantation genetic testing.
It works by determining the chromosomal makeup of the embryo(s) you generated during an IVF cycle. IVF does not change or alter the gender of your embryo.
By knowing the chromosomal makeup of the embryo, you can choose to only transfer embryos of the desired sex (assuming it is also chromosomally normal).
Make An Appointment With Dr. Robles To Discuss Your Fertility Options Today!
Click Here To Make Your Appointment!
Alex Robles, MD
Dr. Alex Robles is a Spanish-speaking Latino-American Reproductive Endocrinologist and Infertility specialist in New York City, and a board-certified OBGYN. He has a special interest in health, lifestyle, & nutrition. Make an appointment with Dr. Robles to discuss your fertility options today!
Cimadomo D, Capalbo A, Ubaldi FM, et al. The Impact of Biopsy on Human Embryo Developmental Potential during Preimplantation Genetic Diagnosis. Biomed Res Int. 2016;2016:7193075. doi:10.1155/2016/7193075
Zhang WY, von Versen-Höynck F, Kapphahn KI, Fleischmann RR, Zhao Q, Baker VL. Maternal and neonatal outcomes associated with trophectoderm biopsy. Fertil Steril. 2019 Aug;112(2):283-290.e2. DOI: 10.1016/j.fertnstert.2019.03.033. Epub 2019 May 15. PMID: 31103283; PMCID: PMC6527329.
Neal SA, Franasiak JM, Forman EJ, Werner MD, Morin SJ, Tao X, Treff NR, Scott RT Jr. High relative deoxyribonucleic acid content of trophectoderm biopsy adversely affects pregnancy outcomes. Fertil Steril. 2017 Mar;107(3):731-736.e1. DOI: 10.1016/j.fertnstert.2016.11.013. Epub 2016 Dec 8. PMID: 27939761.
C. Hanson, T. Hardarson, K. Lundin, C. Bergh, T. Hillensjö, J. Stevic, C. Westin, U. Selleskog, L. Rogberg, M. Wikland, Re-analysis of 166 embryos not transferred after PGS with advanced reproductive maternal age as indication, Human Reproduction, Volume 24, Issue 11, November 2009, Pages 2960–2964
Han AR, Park CW, Lee HS, Yang KM, Song IO, Koong MK. Blastocyst transfer in frozen-thawed cycles. Clin Exp Reprod Med. 2012;39(3):114-117. doi:10.5653/cerm.2012.39.3.114Hentemann MA, Briskemyr S, Bertheussen K. Blastocyst transfer and gender: IVF versus ICSI. J Assist Reprod Genet. 2009;26(8):433-436. doi:10.1007/s10815-009-9337-3
Shaia K, Truong T, Pieper C, Steiner A. Pre-implantation genetic testing alters the sex ratio: an analysis of 91,805 embryo transfer cycles. J Assist Reprod Genet. 2020 May;37(5):1117-1122. DOI: 10.1007/s10815-020-01746-1. Epub 2020 Mar 25. PMID: 32215822; PMCID: PMC7244641.
Kirshenbaum M, Feldman B, Aizer A, Haas J, Orvieto R. Preimplantation embryos sex ratios in couples with four or more children of same-sex, what should be expected from a preimplantation genetic diagnosis cycle? Gynecol Endocrinol. 2019 Jun;35(6):515-517. DOI: 10.1080/09513590.2018.1563886. Epub 2019 Feb 10. PMID: 30741052.
Al-Jaroudi D, Salim G, Baradwan S. Neonate female to male ratio after assisted reproduction following antagonist and agonist protocols. Medicine (Baltimore). 2018;97(38):e12310. doi:10.1097/MD.0000000000012310
Karabinus DS, Marazzo DP, Stern HJ, et al. The effectiveness of flow cytometric sorting of human sperm (MicroSort®) for influencing a child's sex. Reprod Biol Endocrinol. 2014;12:106. Published 2014 Nov 24. doi:10.1186/1477-7827-12-106
Copyright © 2023 Alex Robles, MD
https://alexroblesmd.com/wp-content/cache/breeze-minification/js/breeze_d8b9ac1cac0e674c1a0b0961093927ba.js
https://alexroblesmd.com/wp-content/cache/breeze-minification/js/breeze_e709f6277bbec007e5a021ac9cdc419b.js
https://alexroblesmd.com/wp-content/cache/breeze-minification/js/breeze_d547670ec89793e8d0d9d2c3e7048848.js
https://alexroblesmd.com/wp-content/cache/breeze-minification/js/breeze_b410f7096d4a966b622520512b7f5e7d.js


Here are some simple Mother's day gift ideas that are easy for young children to make.
This is a very special box, that only you can see.
The reason it's so special it's just for you from me.
It's filled with hugs and kisses as sweet as sweet can be.
Just hold the box close to your heart, and you'll always think of me.
Have children decorate a medium size ceramic tile with permanent marker and tempra paint. Let dry for about 2 hours and then shellac the tile and let dry.
Treat your mom! Separate Epsom salts into bowls, one for each color. Add a few drops of food coloring in each bowl and stir well. Add a few drops of scented oil in each bowl and stir again. Help the child layer the salts into a clean baby food jar. Place lid on jar and decorate with ribbon.
Use an old baby shoe brought in by the child. Line the shoe with a small plastic bag having the top of the bag at the top of the shoe sticking out. Assist the children in filling the bag with potting soil and transplanting a flower or small plant in it. Decorate the gift with fancy shoes laces and ribbon.
You can start with a cheap frame of make one from sturdy cardboard or craft sticks. Attach the lettering "I am cute as a button!" to the top of the frame and allow children to choose from a variety of small buttons to glue around the perimeter of the frame. A wonderful keepsake for mother.
Children make dough of Ivory Soap Flakes moistened with water. They can then roll out three or four small bars. Add food coloring and perfume to each portion before shaping. Allow the balls to dry and harden for a few days. They can wrap their balls in colored cellophane and decorate with ribbon.
Was made for you by little me.
That will smell sweet for many hours.
And tied a bow in a special place.
To remind you of this Mother's Day!


I always wondered who planted them in the neighboring field, a double row of yellow daffodils, up each spring, winding toward nothing, as if arriving at an invisible porch, invisible house.
Excellent! Both prose and haiku perfect.
When I read the line "lives we might have lived' I thought of "The After Hours' on Netflix Streaming, The Twilight Zone: Season 1 Episode 34.
Excellent piece, I really enjoyed it a lot!
Grand_! Too, as thoughts echo from each blossom, a new sense of life; nature's lead.


DEAR PAPERLICIOUS: An Interview with Laura Bassen!
You know Laura Bassen and her fabulous blog, Doublestick Heaven, as the creator of perfectly executed and colorful designs, and funny and informative videos. She's the master of masking, ink blending, and creating plaids.
I was curious how this mother of five young kids manages to create and blog so many beautiful designs. So, I was thrilled when Laura agreed to be interviewed. Rather than send questions and answers through email, Laura and I spoke on the phone for about an hour and a half (oh, we both have the gift o' gab!).
Joan: Let's talk card design first. How do you come up with an idea for a card?
Laura: Joan, I don't know! Really, it can be a bit of a mystery. I no longer stamp just for fun. It has honestly become a job, and I'm usually creating a card design for an assignment or because I agreed to help promote something or someone. So, I usually start with a stamp set or other products that I need to feature.
Ninety percent of my design of a card is done before I pick up an ink pad. Most of the time I'm thinking about different designs and just trying them out in my head. Depending on when I get the stamps or other products, it can take awhile. Sometimes I take a products' release and spread it out on my kitchen table and see what jumps out or inspires me.
I knew I wanted a background, and was feeling a bit stuck. I checked out Betsy Veldman's because I know Betsy has great backgrounds.
Every card is an evolution from brainstorming to execution. It never ends up how I pictured it in my head. Sometimes it's better and sometimes it's a flop. Then I start again, until I'm satisfied.
Joan: So it's natural talent?
Laura: It does take talent, but mostly it takes hard work and perseverance. If you want to do design work, you have to work at it. You have to push through design blocks and insecurities. I think true success comes from walking that fine line of simply loving the craft and always striving to improve. I'm never satisfied. I always want to improve on my techniques, my photography, my videos. That's what keeps me going.
Joan: Your cards are so bright and fun and crisp. Is there a particular ink you recommend?
Laura: Oh, boy! I love inks. There are so many out there and they all are great for different reasons. It really depends on the technique. If I want to "ink smoosh" I use the Distress Inks. If I want to blend, I use my Simon Says Stamp inks. The Mama Elephant pigment inks blend like butter, too. For Copic coloring I use Memento Tuxedo Black and for crisp black sentiments I use Versafine Onyx Black.
Joan: How did you go from making cards as a hobby to having a job in the industry?
Laura: Initially I started my blog because I wanted to be part of the stamping community and participate in challenges. Eventually it led to design team opportunities, most of which were not compensated. Now, stamping is my job, meaning that I earn a real income at it. I get to work from home doing something I love. It honestly is a dream job for me. It's not a cake walk, but I really love it.
Joan: I can imagine the fun parts. What's the "not fun" part?
Laura: The hardest part is keeping a healthy balance between family life and work. If you don't watch it, card making can take every last second of your day and you will miss out on the important stuff. The other part that is not-so-fun is the juggling of multiple deadlines at once. The pressure of producing quality work on demand can sometimes be a strain. Also pushing through insecurities and self-doubt is an ongoing battle that everyone faces.
Joan: How do you make money? Free product, pay?
Laura: Many companies pay their designers and some pay with free product or offer affiliate linking.
Joan: I always wondered how affiliate linking worked. To be honest, I never think to purchase through affiliate links. Now I will.
Laura: It is a great way to "tip" your favorite designers without spending any money yourself. In other words, the stamper is going to pay the same amount regardless of whether he or she clicks a link on my, or some other stamper's, blog.
Joan: Let's talk videos. Yours are fabulous. What's your secret?
Laura: Editing! I try to make a video that I would want to watch. I like them short and sweet, so I edit to take out parts that I don't think are necessary.
Joan: Are they time consuming to make?
Laura: Yes. It can take most of the day to create a card, film it, photograph it, edit the photos, edit the video footage, do the voice-over, upload it & then write up a blog post. You would be astonished at how many times I have to record myself saying hello over and over again until I'm happy with it!
Joan: You do a great job of making people want to buy a stamp that someone else designed. Have you ever thought about designing stamps?
It was a blast talking with Laura. She was interesting and motivating. Knowing how full her life already is, I really appreciated the time she took to chat and edit this interview. I hope you enjoyed it as much as I did.
Note: there will be no interview posted in January, but I have a fabulous one scheduled for February! Thanks for reading!
thanks for the fun interview with Laura - i love her style, humor(which shines in the interview)and bright cards!
I love Laura AND her work! She is SO entertaining and her cards are amazing so its always a great day when I see she has something to share!
I really enjoyed this peek into Laura's world, Joan! She is right up there as one of my clean and simple favorites, along with Kay Miller. When I see her work, I *always* think, "Wow! Wish I'd thought of that!!" I hope you have a wonderful, peaceful Christmas.
Awesome interview...I wish it was longer, just to know more about her work & etc. but she's got those five kids...design team work, a hubs and God knows what else going on...her time is precious. Love her blog too. Thanks for interviewing her...love her a lot.
Thank you for the fun interview! I love Laura! She is awesome and has taught me so much about card design through her blog and videos.
Thanks for the great interview with Laura. She is an inspiring card maker.
I adore Laura...she's am amazing lady, Mom, Designer and friend..so happy to see you love her too!!
Laura has amazing talent and her cards make my CAS-lovin' heart so very happy! Thanks so much for sharing your conversation with her, Joan.
Thanks for sharing your conversation with Laura - she rocks! And so do you!
Great interview - Laura is one of my idols!
This was so fun! It was great to get a peek into her world. I think she ranks up there as a favorite of a lot of us!
Awesome interview, Joan! Great questions and fun answer from Laura. Her work is amazing and her videos very entertaining. I admire her ability to juggle her family and working from home with deadlines galore.
My friend Janeen sent me here and I am so glad she did. What a great interview. Wishing you a wonderful holiday!
What a great interview. I love Lauren's style & her fun videos. I'll bet the two of you had a grand time talking as you are both so fun. Thanks!
Love, love, love this interview! Laura's style is clean, colorful, sometimes fun, and sometimes elegant. I wish I had her talent but since I don't I'm happy that she has videos and shares her tips.


text:
Sylvia Earle, Contributor
Oceanographer, explorer, author
The Public Sides With Point Reyes Wilderness
This month, the National Park Service released the results of its final public input process that will inform its upcoming decision on the fate of wilderness protection at Drakes Estero, within the spectacular Point Reyes National Seashore. The outcome is good news for the Seashore, its marine plants and wildlife, and for the tens of thousands of people throughout California and the nation who support achieving the historic objective for the Estero as the first protected marine wilderness on the West Coast.
An overwhelming majority -- 92% of the over 52,000 public comments submitted -- were in favor of full wilderness protection. This response is compatible with the 1976 Point Reyes Wilderness Act, which conferred full wilderness protection for Drakes Estero starting in 2012, when an existing oyster company's lease expires. Under most circumstances, that should have been the end of the story, but this critically valuable estuary is now threatened by private interests and political maneuvering intent on subverting the public's wishes and the law's requirements.
I first visited Drakes Estero in 1966, 10 years before Congress recognized it as a special place, worthy of permanent protection. Most of California's estuaries, beaches, marshes and coastal meadows had been acquired for commercial exploitation by the time that people were beginning to awaken to the magnitude of the loss, and the cost of such actions to the public good. Today, we understand the importance of protecting our beautiful and fragile coastline.
For years, the oyster company's leasing deal has been honored by people of the country despite growing awareness of the immense benefits derived from protecting natural areas. Drakes Bay Oyster Company knew the limited terms of use when they bought the business seven years ago from the original owner. It is time for the new owners to honor this historic marine wilderness designation, and stop seeking special favors in order to derive financial gain at the expense of a national treasure.
It is not difficult for either the casual park visitor or the seasoned scientist to recognize the ecological significance of Drakes Estero -- enhanced by robust eelgrass meadows and sandbars that provide nursery areas for fish, harbor seals and other marine life, and are visited by tens of thousands of shorebirds and waterfowl. Estuaries such as Drakes Estero play a critical role in the larger marine ecosystem that many are urgently working to protect and save from irreparable damage. Their blend of soil, nutrients, saltwater and freshwater allows for ecological processes not possible elsewhere.
The public comments release comes amid repeated signs that the company's operations are highly at odds with the Seashore's goal to protect such sensitive, rare habitat. Last month, the California Coastal Commission criticized the company for allegedly illegally operating motorboats within a harbor seal protection area over the past four years.
The Estero can be restored to its natural ecology, beauty and productivity, but only if it is free of this industrial operation that cultivates non-native oysters. More than 30 years ago, Congress concluded that Drakes Estero deserved full wilderness status. Today, the sheer quantity of supportive public comments illustrate it was the right decision then and now.
Interior Secretary Salazar will soon make the final decision on the future of Drakes Estero -- a decision that will have implications far beyond Point Reyes. At stake is the future of one of the nation's last largely intact estuaries, a hope spot within the nation's increasing troubled waters. It is my wish, and that of the thousands of others who spoke in defense of Drakes Estero, that the right decision is forthcoming.
Sylvia A. Earle, former Chief Scientist of National Oceanic and Atmospheric Administration, is Explorer in Residence at the National Geographic, Founder of the Mission Blue Foundation, principal science adviser for One World One Ocean, 2009 TED Prize Winner and author of the 2009 Illustrated Atlas of the Ocean and The World is Blue.
Oceans Conservation Environment National Parks Sylvia Earle


text:
NEWSCLIP-1998-03-25: Two Articles related to the KAL801 Hearing (Honolulu Star-Bulletin)
Two Systems Down in KAL 801 Crash
The glide slope at the airport and the plane's
altitude warning system were out of service
By Lori Tighe
Star-Bulletin
Relatives of the victims listen to a translation during
Yesterday's hearing on the crash of Korean Air Flight 801
on Guam last August. [PHOTO: Craig T. Kojima, Star-Bulletin]
Air traffic controllers who tried to help Korean Air Flight 801 land on Guam last August testified yesterday that two critical systems were out of service: the glide slope and the minimum safe altitude warning system, nicknamed "the last chance."
The flight crashed into a hillside near the Guam airport on Aug. 6, 1997, killing 228 people. The National Transportation Safety Board is holding hearings here this week to try to determine the cause of the crash.
The glide slope, which acts as a tractor beam to guide the plane down, was being typhoon-proofed to safeguard it from storms.
The minimum safe altitude warning system (MSAW), a high-tech computer system that warns air traffic controllers about planes flying too low, had been reconfigured, and in effect decommissioned, because of too many false alarms.
Kurt Mayo, Guam radar controller, said he thought the crew knew the glide slope was down. He also said he wasn't aware the MSAW had been reconfigured and was basically useless.
"Any doubt in your mind the crew would have known the glide slope was out?" asked Richard Wentworth, an investigator with the National Transportation Safety Board.
"No," Mayo answered.
If MSAW had worked, Guam air traffic controller Marty Theobald told the investigating board, "I would have alerted the plane to check their altitude immediately."
After the Guam accident, officials from the Federal Aviation Administration testified they checked MSAWs in all 50 U.S. states to ensure they worked.
"Technology has worked, but one of its revenge effects is relying on it to an inappropriate degree," said Jim Burnett, former chairman of the National Transportation Safety Board and now a transportation safety consultant.
He said he found the hearing's first day of testimony informative.
"There were additional problems with air traffic control. Everyone was supposed to know about the two critical systems down, but not everyone knew," Burnett said. "False signals may have indicated to the captain it was working. We'll hear more about that later."
The pilot of Flight 801, Capt. Yong-Chul Park, received notice before the flight of the downed glide slope, which wouldn't guide him through the mountainous terrain near Guam's airport.
According to the cockpit recorder, Park even briefed his crew about the downed glide slope. But in the minutes leading up to the crash, the captain and crew went back and forth about whether the glide slope was working.
The Safety Board said it became concerned about the possibility of "spurious" radio signals, possibly leading the captain to believe the glide slope worked after all. Witnesses will testify about electronic interference that may have contributed to the crew's confusion.
The crew's final caution, a ground proximity warning system on the plane, apparently warned the crew they flew too low, Burnett said. "But in this case they weren't quick to respond to it."
Another suggestion involved the possibility that Asian cultural respect for authority might have caused the crew not to challenge the pilot about the danger.
"It's the kind of thing you have to look at," Burnett said. Cultural differences among international flight crews have played a part in past plane crashes, he said.
"A classic story of one was a plane crash in Spain, where the air traffic controller was yelling, 'Pull up! Pull up!' and the captain said, 'Shut up, gringo,' before he flew into a mountain," Burnett said.
But Muchol Shin, spokesman for Korean Air, smiled and shook his head at the suggestion the Korean crew failed to protest to the Korean captain before the crash.
"A cultural issue was not a case here. They were too busy with the landing procedure and thought everything was normal," Shin said.
Koreans have two language protocols based on age, he said. Younger Koreans use "sir" with older Koreans, for example. The older engineer on Flight 801 didn't use "sir" a few times when addressing the younger captain on the cockpit recording, Shin said.
"I would rather put it as an ill-fated flight where everything went wrong," he said.
Air crash survivor wants answers
By Ben DiPietro
Flames singed Kim Duck-hwan's skin as he climbed through a hole punched through the roof of Korean Air Flight 801 moments after it slammed into a Guam hillside.
The cool rain Kim felt when he crawled out of the plane did little to dull his pain. More than seven months after the Aug. 6 accident, Kim still wears bandages on his hands and has third-degree burns on more than 45 percent of his body.
He also still does not have any answers as to what caused the crash or whether any actions could have saved the 228 passengers and crew who died.
The plane had taken off from Seoul, South Korea, and was filled with Korean vacationers, including honeymooners.
As National Transportation Safety Board hearings into the cause of the crash continue today, Kim wants answers and the parties involved to take responsibility.
"All of the parties being given a platform to speak are partly responsible," Kim said yesterday in Korean with an interpreter and two American attorneys by his side. "Everyone in this hearing who is able to speak out should bear some responsibility for this accident.
"With an accident of this magnitude, there is no way only one party is responsible."
No advance warning was given to passengers that a crash was imminent, and Kim believed the plane was landing when the tail actually was hitting the mountain.
"However, when the plane bounced back down and the wing caught fire and exploded, that's when I realized it was an accident," said Kim, whose fiancee was engulfed in flames and died.
"I remember everything," he said. "I was not thinking. I was just going by instinct."
Controller Kurt Mayo tried to explain yesterday why there was a 23-minute gap between the crash and the first reported call for help from the airport tower. He said he wanted verification from another incoming aircraft that Flight 801 had crashed before requesting an assistant to call for help.
For Kim, preventing future crashes won't restore his life to what it was before the crash.
"I am very lucky and grateful to be alive," Kim said. "But no amount of money or apology . . . can compensate for the loss."
Copied 8-18-13 from
http://archives.starbulletin.com/1998/03/25/news/story1.html
Slight format changes by aiREFORM.


text:
pimcore.registerNS("pimcore.element.selector.selector");
pimcore.element.selector.selector = Class.create({

    initialize: function (multiselect, callback, restrictions, config) {

        this.initialRestrictions = restrictions ? restrictions: {};
        this.callback = callback;
        this.restrictions = restrictions;
        this.multiselect = multiselect;
        this.config = typeof config != "undefined" ? config : {};

        if(!this.multiselect) {
            this.multiselect = false;
        }

        var possibleClassRestrictions = [];
        var classStore = pimcore.globalmanager.get("object_types_store");
        classStore.each(function (rec) {
             possibleClassRestrictions.push(rec.data.text);
        });

        var restrictionDefaults = {
            type: ["document","asset","object"],
            subtype: {
                document: ["page", "snippet","folder","link","hardlink","email"], //email added by ckogler
                asset: ["folder", "image", "text", "audio", "video", "document", "archive", "unknown"],
                object: ["object", "folder", "variant"]
            },
            specific: {
                classes: possibleClassRestrictions // put here all classes from global class store ...
            }
        };

        if(!this.restrictions) {
            this.restrictions = restrictionDefaults;
        }

        this.restrictions = Ext.applyIf(this.restrictions, restrictionDefaults);

        if(!this.callback) {
            this.callback = function () {};
            //throw "";
        }

        this.panel = new Ext.Panel({
            tbar: this.getToolbar(),
            border: false,
            layout: "fit"
        });

        this.window = new Ext.Window({
            width: 850,
            height: 550,
            modal: true,
            layout: "fit",
            items: [this.panel]
        });

        this.window.show();

        var user = pimcore.globalmanager.get("user");

        if(in_array("document", this.restrictions.type) && user.isAllowed("documents")) {
            this.searchDocuments();
        }
        else if(in_array("asset", this.restrictions.type) && user.isAllowed("assets")) {
            this.searchAssets();
        }
        else if(in_array("object", this.restrictions.type) && user.isAllowed("objects")) {
            this.searchObjects();
        }
    },

    getToolbar: function () {

        var user = pimcore.globalmanager.get("user");
        var toolbar;
        var items = [];
        this.toolbarbuttons = {};

        if(in_array("document", this.restrictions.type) && user.isAllowed("documents")) {
            this.toolbarbuttons.document = new Ext.Button({
                text: t("documents"),
                handler: this.searchDocuments.bind(this),
                iconCls: "pimcore_icon_document",
                enableToggle: true
            });
            items.push(this.toolbarbuttons.document);
        }

        if(in_array("asset", this.restrictions.type) && user.isAllowed("assets")) {
            items.push("-");
            this.toolbarbuttons.asset = new Ext.Button({
                text: t("assets"),
                handler: this.searchAssets.bind(this),
                iconCls: "pimcore_icon_asset",
                enableToggle: true
            });
            items.push(this.toolbarbuttons.asset);
        }

        if(in_array("object", this.restrictions.type) && user.isAllowed("objects")) {
            items.push("-");
            this.toolbarbuttons.object = new Ext.Button({
                text: t("objects"),
                handler: this.searchObjects.bind(this),
                iconCls: "pimcore_icon_object",
                enableToggle: true
            });
            items.push(this.toolbarbuttons.object);
        }

        if(this.config["moveToTab"]) {
            items.push("->");
            this.toolbarbuttons.moveToTab = new Ext.Button({
                text: t("move_to_tab"),
                handler: this.moveToTab.bind(this),
                iconCls: "pimcore_icon_movetotab",
                enableToggle: false
            });
            items.push(this.toolbarbuttons.moveToTab);
        }

        if(items.length > 1) {
            toolbar = {
                items: items
            };
        }

        return toolbar;
    },

    moveToTab: function () {

        this.toolbarbuttons.moveToTab.hide();

        // create new tab-panel
        this.myTabId = "pimcore_search_" + uniqid();

        this.tabpanel = new Ext.Panel({
            id: this.myTabId,
            iconCls: "pimcore_icon_search",
            title: t("search"),
            border: false,
            layout: "fit",
            closable:true,
            items: [this.panel]
        });

        var tabPanel = Ext.getCmp("pimcore_panel_tabs");
        tabPanel.add(this.tabpanel);
        tabPanel.activate(this.myTabId);

        pimcore.layout.refresh();

        this.window.close();
    },

    setSearch: function (panel) {
        delete this.current;
        this.panel.removeAll();
        this.panel.add(panel);

        this.panel.doLayout();
    },

    resetToolbarButtons: function () {
        if(this.toolbarbuttons.document) {
            this.toolbarbuttons.document.toggle(false);
        }
        if(this.toolbarbuttons.asset) {
        this.toolbarbuttons.asset.toggle(false);
        }
        if(this.toolbarbuttons.object) {
            this.toolbarbuttons.object.toggle(false);
        }
    },

    searchDocuments: function () {
        this.resetToolbarButtons();
        this.toolbarbuttons.document.toggle(true);

        this.current = new pimcore.element.selector.document(this);
    },

    searchAssets: function () {
        this.resetToolbarButtons();
        this.toolbarbuttons.asset.toggle(true);

        this.current = new pimcore.element.selector.asset(this);
    },

    searchObjects: function () {
        this.resetToolbarButtons();
        this.toolbarbuttons.object.toggle(true);

        this.current = new pimcore.element.selector.object(this);
    },

    commitData: function (data) {
        this.callback(data);
        this.window.close();
    }
});

redpajama_set_name: RedPajamaGithub


text:
Bad Drugs
Morcellator and Cancer
Syngenta GMO Corn
If you are a loved one have been affected by a recalled drug or medical device, you may have legal options.
Attorney Group for Ohio / Lawsuits / Ohio Defective Medical Device Attorney / Ohio Bair Hugger Lawsuit
Ohio Bair Hugger Lawsuit
targovcom/iStock/Thinkstoc
An Ohio Bair Hugger lawsuit may be an option for patients who experienced severe infection following joint replacement surgery. Bair Hugger warming blankets are designed to maintain patient body temperature, curb the risk of infection, and prevent hypothermia during surgical procedures. Although Bair Hugger systems are often the preferred warming method during many surgeries, the warming blankets have been allegedly linked to severe infections, particularly in heart surgery and hip and knee replacement patients. Affected patients and their families may be eligible to pursue compensation with the help of an Ohio Bair Hugger lawsuit attorney.
For more information, contact Attorney Group for Ohio. We offer free, confidential, no obligation consultations. We can help answer your questions, and if you choose to pursue a case we can connect you with an affiliated Bair Hugger lawsuit attorney who can assist you throughout the legal process.
The time you have to pursue a claim is limited. Contact us for more information.Get Help Now.
What is a Bair Hugger Warming Blanket and How Does It Work?
Originally launched in 1987 and approved by the U.S. Food and Drug Administration (FDA) in 1988, the Bair Hugger warming blanket system uses the surrounding air temperature to maintain a patient's body temperature, lower the risk of infection, and prevent perioperative hypothermia.
Forced-air warming (FAW) blankets such as the Bair Hugger system consist of two primary components: (1) a warming unit and (2) a single-use blanket. Forced-air warming blankets push the surrounding air from the warming unit through a hose connected to the disposable blanket. Once the warm air is circulated throughout the blanket, the air exits through tiny holes or perforations on the underside of the blanket, away from the surgical site.
Bair Hugger Warming Blanket Risks
Bair Hugger warming blankets are one of the most trusted brands used to keep patients warm during surgical procedures, however, there have been a number of risks allegedly associated with the systems, including second degree burn and infections.
In an adverse event report released in 2012, a patient claimed to have experienced second degree burns as a result of using the Bair Hugger system during a surgical procedure.
Although Bair Hugger warming blankets are designed to reduce the risk of infections, some patients claim that the devices may actually lead to an increased risk of infection by blowing bacteria-contaminated air into the surgical site. The risk of infection is especially serious for patients undergoing surgery to replace heart valves, hip joints, or knees.
According to an article published in 2009, researchers concluded that the design of FAW equipment is questionable for preventing the emission of airborne contamination. Likewise, the study noted that operating instructions from FAW manufacturers did not provide a method for decontaminating the inside of the hose or blower. Based on the results of the study, researchers have suggested that FAW manufacturers should reconsider the design of their FAW blowers.
Bair Hugger Lawsuits
A Bair Hugger lawsuit filed in the state of Kansas claims that the manufacturers of the warming blanket, 3M Company and Arizant Healthcare, Inc., were negligent and failed to properly warn patients of the risks associated with the devices.
The lawsuit alleges that the manufacturers of the Bair Hugger warming system have known about the risk of pathogenic contamination since at least 2009. Despite this knowledge, the manufacturers continued to actively and aggressively market the Bair Hugger FAW as safe in both general and orthopedic surgeries.
According to the lawsuit, the manufacturers admitted in a letter to the FDA that "air blown intraoperatively across the surgical wound may result in airborne contamination." The lawsuit further alleges that the device's manufacturers countered this flaw in their products by misrepresenting to the FDA that the risk of contamination is alleviated by the use of a tape barrier, which the lawsuit claims is false.
Furthermore, the lawsuit alleges that the manufacturers made a number of misleading and false claims concerning their products, including claims about the risk of surgical site infection. As a result of the manufacturer's wrongful conduct, the plaintiff claimed to have sustained economic damages, severe and permanent injuries, pain, suffering, and emotional distress.
How an Ohio Bair Hugger Lawsuit Can Help
monkeybusinessimages/iStock/Thinkstock
Medical device makers have a duty to provide safe products. If there are risks of harm associated with their products, they also must provide adequate warnings. If a product maker fails to fulfill this duty, it could be held liable in lawsuits for injuries that may result.
People injured by Bair Hugger warming blankets may be eligible to recover money for:
The families of those who have died may be eligible to recover money for funeral expenses and the pain that comes with losing a loved one.
The Time You Have to Pursue a Claim is Limited. Contact Us Today.
For more information, contact Attorney Group for Ohio. You can fill out the form on this page or contact us by phone or email.
After you contact us, an attorney will follow up to answer questions that you might have. There is no cost or obligation to speak with us, and any information you provide will be kept confidential.
Please note that the law limits the time you have to pursue a claim or file a lawsuit for an injury. If you think you have a case, you should not delay taking action.
Attorney Group reviewed by:
Lauren A. on May 16, 2016
"These guys are a pleasure to work with -- very strategic and very responsive, which makes for a great business partner! I can tell that they are passionate about making sure all clients get the attention and expertise they deserve."
Rating: 5 ★★★★★
Terms of Use, Disclaimers, and Privacy Policy
Enter your email below for updates
Attorney Group for Ohio
6071 Montgomery Rd.
Cincinnati OH 45213,
© 2021 All Rights Reserved Disclaimers and Privacy


Everyday Liquid Sunshine – Vitamin D3 Drops 1oz.
Other Ingredients: Fractionated coconut oil and natural lemon flavor.
NO corn, soy, salt, gluten, milk & egg products, sugar, starch, or preservatives.
NON-GMO – This product does not contain genetically modified materials.


Download1524 X 974 | 1024 X 654 | 300 X 192 | 150 X 150. This Exciting Rubber Flooring For Gyms Exercise Room .
Exercise Room Flooring was posted on September 2, 2018 at 12:33 am. It is published in the Floor category. Exercise Room Flooring is labelled with Exercise Room Flooring, Exercise, Room, Flooring..
Global warming's problem and the reduction of recording that is illegal significantly being echoed inside our ears. Additionally, being a warm country that likewise competed with a role because the lungs of the planet. But what electricity if its populace less friendly for the setting, or doesn't? of alternate resources, such as Exercise Room Flooring, less usage for example.
Exercise Room Flooring framed provide and mirror by colour might be a modern ornaments that are decorative that are national. Though a straightforward condition, towel tray made-of bamboo, such as within the image above doesn't seem oldfashioned, truly. Its modest layout, fused having a modern style minimalism. As we know, the bamboo-part having its stops closed. Sealed stops may be used as planting channel that was pure. Merely require ability and dexterity, subsequently be potted plant of bamboo.
To be more proficient and experienced utilize bamboo, notice the house is decorated by tip sundries with bamboo subsequent editorial style. Bamboo is associated with standard materials that are less contemporary. Probably this really is a very important factor that produces plenty of people 'modern' who WOn't use bamboo. But into furniture, bamboo could be transformed in the palms of the creative brain.