text:
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/cert/nss_cert_database.h"

#include <cert.h>
#include <certdb.h>
#include <keyhi.h>
#include <pk11pub.h>
#include <secmod.h>

#include "base/bind.h"
#include "base/callback.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list_threadsafe.h"
#include "base/task_runner.h"
#include "base/task_runner_util.h"
#include "base/threading/worker_pool.h"
#include "crypto/scoped_nss_types.h"
#include "net/base/crypto_module.h"
#include "net/base/net_errors.h"
#include "net/cert/cert_database.h"
#include "net/cert/x509_certificate.h"
#include "net/third_party/mozilla_security_manager/nsNSSCertificateDB.h"
#include "net/third_party/mozilla_security_manager/nsPKCS12Blob.h"

// In NSS 3.13, CERTDB_VALID_PEER was renamed CERTDB_TERMINAL_RECORD. So we use
// the new name of the macro.
#if !defined(CERTDB_TERMINAL_RECORD)
#define CERTDB_TERMINAL_RECORD CERTDB_VALID_PEER
#endif

// PSM = Mozilla's Personal Security Manager.
namespace psm = mozilla_security_manager;

namespace net {

namespace {

// TODO(pneubeck): Move this class out of NSSCertDatabase and to the caller of
// the c'tor of NSSCertDatabase, see https://crbug.com/395983 .
// Helper that observes events from the NSSCertDatabase and forwards them to
// the given CertDatabase.
class CertNotificationForwarder : public NSSCertDatabase::Observer {
 public:
  explicit CertNotificationForwarder(CertDatabase* cert_db)
      : cert_db_(cert_db) {}

  ~CertNotificationForwarder() override {}

  // NSSCertDatabase::Observer implementation:
  void OnCertAdded(const X509Certificate* cert) override {
    cert_db_->NotifyObserversOfCertAdded(cert);
  }

  void OnCertRemoved(const X509Certificate* cert) override {
    cert_db_->NotifyObserversOfCertRemoved(cert);
  }

  void OnCACertChanged(const X509Certificate* cert) override {
    cert_db_->NotifyObserversOfCACertChanged(cert);
  }

 private:
  CertDatabase* cert_db_;

  DISALLOW_COPY_AND_ASSIGN(CertNotificationForwarder);
};

}  // namespace

NSSCertDatabase::ImportCertFailure::ImportCertFailure(
    const scoped_refptr<X509Certificate>& cert,
    int err)
    : certificate(cert), net_error(err) {}

NSSCertDatabase::ImportCertFailure::~ImportCertFailure() {}

NSSCertDatabase::NSSCertDatabase(crypto::ScopedPK11Slot public_slot,
                                 crypto::ScopedPK11Slot private_slot)
    : public_slot_(public_slot.Pass()),
      private_slot_(private_slot.Pass()),
      observer_list_(new base::ObserverListThreadSafe<Observer>),
      weak_factory_(this) {
  CHECK(public_slot_);

  // This also makes sure that NSS has been initialized.
  CertDatabase* cert_db = CertDatabase::GetInstance();
  cert_notification_forwarder_.reset(new CertNotificationForwarder(cert_db));
  AddObserver(cert_notification_forwarder_.get());

  psm::EnsurePKCS12Init();
}

NSSCertDatabase::~NSSCertDatabase() {}

void NSSCertDatabase::ListCertsSync(CertificateList* certs) {
  ListCertsImpl(crypto::ScopedPK11Slot(), certs);
}

void NSSCertDatabase::ListCerts(
    const base::Callback<void(scoped_ptr<CertificateList> certs)>& callback) {
  scoped_ptr<CertificateList> certs(new CertificateList());

  // base::Passed will NULL out |certs|, so cache the underlying pointer here.
  CertificateList* raw_certs = certs.get();
  GetSlowTaskRunner()->PostTaskAndReply(
      FROM_HERE,
      base::Bind(&NSSCertDatabase::ListCertsImpl,
                 base::Passed(crypto::ScopedPK11Slot()),
                 base::Unretained(raw_certs)),
      base::Bind(callback, base::Passed(&certs)));
}

void NSSCertDatabase::ListCertsInSlot(const ListCertsCallback& callback,
                                      PK11SlotInfo* slot) {
  DCHECK(slot);
  scoped_ptr<CertificateList> certs(new CertificateList());

  // base::Passed will NULL out |certs|, so cache the underlying pointer here.
  CertificateList* raw_certs = certs.get();
  GetSlowTaskRunner()->PostTaskAndReply(
      FROM_HERE,
      base::Bind(&NSSCertDatabase::ListCertsImpl,
                 base::Passed(crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot))),
                 base::Unretained(raw_certs)),
      base::Bind(callback, base::Passed(&certs)));
}

#if defined(OS_CHROMEOS)
crypto::ScopedPK11Slot NSSCertDatabase::GetSystemSlot() const {
  return crypto::ScopedPK11Slot();
}
#endif

crypto::ScopedPK11Slot NSSCertDatabase::GetPublicSlot() const {
  return crypto::ScopedPK11Slot(PK11_ReferenceSlot(public_slot_.get()));
}

crypto::ScopedPK11Slot NSSCertDatabase::GetPrivateSlot() const {
  if (!private_slot_)
    return crypto::ScopedPK11Slot();
  return crypto::ScopedPK11Slot(PK11_ReferenceSlot(private_slot_.get()));
}

CryptoModule* NSSCertDatabase::GetPublicModule() const {
  crypto::ScopedPK11Slot slot(GetPublicSlot());
  return CryptoModule::CreateFromHandle(slot.get());
}

CryptoModule* NSSCertDatabase::GetPrivateModule() const {
  crypto::ScopedPK11Slot slot(GetPrivateSlot());
  return CryptoModule::CreateFromHandle(slot.get());
}

void NSSCertDatabase::ListModules(CryptoModuleList* modules,
                                  bool need_rw) const {
  modules->clear();

  // The wincx arg is unused since we don't call PK11_SetIsLoggedInFunc.
  crypto::ScopedPK11SlotList slot_list(
      PK11_GetAllTokens(CKM_INVALID_MECHANISM,
                        need_rw ? PR_TRUE : PR_FALSE,  // needRW
                        PR_TRUE,                       // loadCerts (unused)
                        NULL));                        // wincx
  if (!slot_list) {
    LOG(ERROR) << "PK11_GetAllTokens failed: " << PORT_GetError();
    return;
  }

  PK11SlotListElement* slot_element = PK11_GetFirstSafe(slot_list.get());
  while (slot_element) {
    modules->push_back(CryptoModule::CreateFromHandle(slot_element->slot));
    slot_element = PK11_GetNextSafe(slot_list.get(), slot_element,
                                    PR_FALSE);  // restart
  }
}

int NSSCertDatabase::ImportFromPKCS12(CryptoModule* module,
                                      const std::string& data,
                                      const base::string16& password,
                                      bool is_extractable,
                                      CertificateList* imported_certs) {
  DVLOG(1) << __func__ << " "
           << PK11_GetModuleID(module->os_module_handle()) << ":"
           << PK11_GetSlotID(module->os_module_handle());
  int result = psm::nsPKCS12Blob_Import(module->os_module_handle(),
                                        data.data(), data.size(),
                                        password,
                                        is_extractable,
                                        imported_certs);
  if (result == OK)
    NotifyObserversOfCertAdded(NULL);

  return result;
}

int NSSCertDatabase::ExportToPKCS12(
    const CertificateList& certs,
    const base::string16& password,
    std::string* output) const {
  return psm::nsPKCS12Blob_Export(output, certs, password);
}

X509Certificate* NSSCertDatabase::FindRootInList(
    const CertificateList& certificates) const {
  DCHECK_GT(certificates.size(), 0U);

  if (certificates.size() == 1)
    return certificates[0].get();

  X509Certificate* cert0 = certificates[0].get();
  X509Certificate* cert1 = certificates[1].get();
  X509Certificate* certn_2 = certificates[certificates.size() - 2].get();
  X509Certificate* certn_1 = certificates[certificates.size() - 1].get();

  if (CERT_CompareName(&cert1->os_cert_handle()->issuer,
                       &cert0->os_cert_handle()->subject) == SECEqual)
    return cert0;
  if (CERT_CompareName(&certn_2->os_cert_handle()->issuer,
                       &certn_1->os_cert_handle()->subject) == SECEqual)
    return certn_1;

  LOG(WARNING) << "certificate list is not a hierarchy";
  return cert0;
}

int NSSCertDatabase::ImportUserCert(const std::string& data) {
  CertificateList certificates =
      X509Certificate::CreateCertificateListFromBytes(
          data.c_str(), data.size(), net::X509Certificate::FORMAT_AUTO);
  int result = psm::ImportUserCert(certificates);

  if (result == OK)
    NotifyObserversOfCertAdded(NULL);

  return result;
}

bool NSSCertDatabase::ImportCACerts(const CertificateList& certificates,
                                    TrustBits trust_bits,
                                    ImportCertFailureList* not_imported) {
  crypto::ScopedPK11Slot slot(GetPublicSlot());
  X509Certificate* root = FindRootInList(certificates);
  bool success = psm::ImportCACerts(
      slot.get(), certificates, root, trust_bits, not_imported);
  if (success)
    NotifyObserversOfCACertChanged(NULL);

  return success;
}

bool NSSCertDatabase::ImportServerCert(const CertificateList& certificates,
                                       TrustBits trust_bits,
                                       ImportCertFailureList* not_imported) {
  crypto::ScopedPK11Slot slot(GetPublicSlot());
  return psm::ImportServerCert(
      slot.get(), certificates, trust_bits, not_imported);
}

NSSCertDatabase::TrustBits NSSCertDatabase::GetCertTrust(
    const X509Certificate* cert,
    CertType type) const {
  CERTCertTrust trust;
  SECStatus srv = CERT_GetCertTrust(cert->os_cert_handle(), &trust);
  if (srv != SECSuccess) {
    LOG(ERROR) << "CERT_GetCertTrust failed with error " << PORT_GetError();
    return TRUST_DEFAULT;
  }
  // We define our own more "friendly" TrustBits, which means we aren't able to
  // round-trip all possible NSS trust flag combinations.  We try to map them in
  // a sensible way.
  switch (type) {
    case CA_CERT: {
      const unsigned kTrustedCA = CERTDB_TRUSTED_CA | CERTDB_TRUSTED_CLIENT_CA;
      const unsigned kCAFlags = kTrustedCA | CERTDB_TERMINAL_RECORD;

      TrustBits trust_bits = TRUST_DEFAULT;
      if ((trust.sslFlags & kCAFlags) == CERTDB_TERMINAL_RECORD)
        trust_bits |= DISTRUSTED_SSL;
      else if (trust.sslFlags & kTrustedCA)
        trust_bits |= TRUSTED_SSL;

      if ((trust.emailFlags & kCAFlags) == CERTDB_TERMINAL_RECORD)
        trust_bits |= DISTRUSTED_EMAIL;
      else if (trust.emailFlags & kTrustedCA)
        trust_bits |= TRUSTED_EMAIL;

      if ((trust.objectSigningFlags & kCAFlags) == CERTDB_TERMINAL_RECORD)
        trust_bits |= DISTRUSTED_OBJ_SIGN;
      else if (trust.objectSigningFlags & kTrustedCA)
        trust_bits |= TRUSTED_OBJ_SIGN;

      return trust_bits;
    }
    case SERVER_CERT:
      if (trust.sslFlags & CERTDB_TERMINAL_RECORD) {
        if (trust.sslFlags & CERTDB_TRUSTED)
          return TRUSTED_SSL;
        return DISTRUSTED_SSL;
      }
      return TRUST_DEFAULT;
    default:
      return TRUST_DEFAULT;
  }
}

bool NSSCertDatabase::IsUntrusted(const X509Certificate* cert) const {
  CERTCertTrust nsstrust;
  SECStatus rv = CERT_GetCertTrust(cert->os_cert_handle(), &nsstrust);
  if (rv != SECSuccess) {
    LOG(ERROR) << "CERT_GetCertTrust failed with error " << PORT_GetError();
    return false;
  }

  // The CERTCertTrust structure contains three trust records:
  // sslFlags, emailFlags, and objectSigningFlags.  The three
  // trust records are independent of each other.
  //
  // If the CERTDB_TERMINAL_RECORD bit in a trust record is set,
  // then that trust record is a terminal record.  A terminal
  // record is used for explicit trust and distrust of an
  // end-entity or intermediate CA cert.
  //
  // In a terminal record, if neither CERTDB_TRUSTED_CA nor
  // CERTDB_TRUSTED is set, then the terminal record means
  // explicit distrust.  On the other hand, if the terminal
  // record has either CERTDB_TRUSTED_CA or CERTDB_TRUSTED bit
  // set, then the terminal record means explicit trust.
  //
  // For a root CA, the trust record does not have
  // the CERTDB_TERMINAL_RECORD bit set.

  static const unsigned int kTrusted = CERTDB_TRUSTED_CA | CERTDB_TRUSTED;
  if ((nsstrust.sslFlags & CERTDB_TERMINAL_RECORD) != 0 &&
      (nsstrust.sslFlags & kTrusted) == 0) {
    return true;
  }
  if ((nsstrust.emailFlags & CERTDB_TERMINAL_RECORD) != 0 &&
      (nsstrust.emailFlags & kTrusted) == 0) {
    return true;
  }
  if ((nsstrust.objectSigningFlags & CERTDB_TERMINAL_RECORD) != 0 &&
      (nsstrust.objectSigningFlags & kTrusted) == 0) {
    return true;
  }

  // Self-signed certificates that don't have any trust bits set are untrusted.
  // Other certificates that don't have any trust bits set may still be trusted
  // if they chain up to a trust anchor.
  if (CERT_CompareName(&cert->os_cert_handle()->issuer,
                       &cert->os_cert_handle()->subject) == SECEqual) {
    return (nsstrust.sslFlags & kTrusted) == 0 &&
           (nsstrust.emailFlags & kTrusted) == 0 &&
           (nsstrust.objectSigningFlags & kTrusted) == 0;
  }

  return false;
}

bool NSSCertDatabase::SetCertTrust(const X509Certificate* cert,
                                CertType type,
                                TrustBits trust_bits) {
  bool success = psm::SetCertTrust(cert, type, trust_bits);
  if (success)
    NotifyObserversOfCACertChanged(cert);

  return success;
}

bool NSSCertDatabase::DeleteCertAndKey(X509Certificate* cert) {
  if (!DeleteCertAndKeyImpl(cert))
    return false;
  NotifyObserversOfCertRemoved(cert);
  return true;
}

void NSSCertDatabase::DeleteCertAndKeyAsync(
    const scoped_refptr<X509Certificate>& cert,
    const DeleteCertCallback& callback) {
  base::PostTaskAndReplyWithResult(
      GetSlowTaskRunner().get(),
      FROM_HERE,
      base::Bind(&NSSCertDatabase::DeleteCertAndKeyImpl, cert),
      base::Bind(&NSSCertDatabase::NotifyCertRemovalAndCallBack,
                 weak_factory_.GetWeakPtr(),
                 cert,
                 callback));
}

bool NSSCertDatabase::IsReadOnly(const X509Certificate* cert) const {
  PK11SlotInfo* slot = cert->os_cert_handle()->slot;
  return slot && PK11_IsReadOnly(slot);
}

bool NSSCertDatabase::IsHardwareBacked(const X509Certificate* cert) const {
  PK11SlotInfo* slot = cert->os_cert_handle()->slot;
  return slot && PK11_IsHW(slot);
}

void NSSCertDatabase::AddObserver(Observer* observer) {
  observer_list_->AddObserver(observer);
}

void NSSCertDatabase::RemoveObserver(Observer* observer) {
  observer_list_->RemoveObserver(observer);
}

void NSSCertDatabase::SetSlowTaskRunnerForTest(
    const scoped_refptr<base::TaskRunner>& task_runner) {
  slow_task_runner_for_test_ = task_runner;
}

// static
void NSSCertDatabase::ListCertsImpl(crypto::ScopedPK11Slot slot,
                                    CertificateList* certs) {
  certs->clear();

  CERTCertList* cert_list = NULL;
  if (slot)
    cert_list = PK11_ListCertsInSlot(slot.get());
  else
    cert_list = PK11_ListCerts(PK11CertListUnique, NULL);

  CERTCertListNode* node;
  for (node = CERT_LIST_HEAD(cert_list); !CERT_LIST_END(node, cert_list);
       node = CERT_LIST_NEXT(node)) {
    certs->push_back(X509Certificate::CreateFromHandle(
        node->cert, X509Certificate::OSCertHandles()));
  }
  CERT_DestroyCertList(cert_list);
}

scoped_refptr<base::TaskRunner> NSSCertDatabase::GetSlowTaskRunner() const {
  if (slow_task_runner_for_test_.get())
    return slow_task_runner_for_test_;
  return base::WorkerPool::GetTaskRunner(true /*task is slow*/);
}

void NSSCertDatabase::NotifyCertRemovalAndCallBack(
    scoped_refptr<X509Certificate> cert,
    const DeleteCertCallback& callback,
    bool success) {
  if (success)
    NotifyObserversOfCertRemoved(cert.get());
  callback.Run(success);
}

void NSSCertDatabase::NotifyObserversOfCertAdded(const X509Certificate* cert) {
  observer_list_->Notify(FROM_HERE, &Observer::OnCertAdded,
                         make_scoped_refptr(cert));
}

void NSSCertDatabase::NotifyObserversOfCertRemoved(
    const X509Certificate* cert) {
  observer_list_->Notify(FROM_HERE, &Observer::OnCertRemoved,
                         make_scoped_refptr(cert));
}

void NSSCertDatabase::NotifyObserversOfCACertChanged(
    const X509Certificate* cert) {
  observer_list_->Notify(FROM_HERE, &Observer::OnCACertChanged,
                         make_scoped_refptr(cert));
}

// static
bool NSSCertDatabase::DeleteCertAndKeyImpl(
    scoped_refptr<X509Certificate> cert) {
  // For some reason, PK11_DeleteTokenCertAndKey only calls
  // SEC_DeletePermCertificate if the private key is found.  So, we check
  // whether a private key exists before deciding which function to call to
  // delete the cert.
  SECKEYPrivateKey* privKey =
      PK11_FindKeyByAnyCert(cert->os_cert_handle(), NULL);
  if (privKey) {
    SECKEY_DestroyPrivateKey(privKey);
    if (PK11_DeleteTokenCertAndKey(cert->os_cert_handle(), NULL)) {
      LOG(ERROR) << "PK11_DeleteTokenCertAndKey failed: " << PORT_GetError();
      return false;
    }
  } else {
    if (SEC_DeletePermCertificate(cert->os_cert_handle())) {
      LOG(ERROR) << "SEC_DeletePermCertificate failed: " << PORT_GetError();
      return false;
    }
  }
  return true;
}

}  // namespace net


Year in Review 2018: Norman Bobrow, Norman Bobrow & Co. Inc.
Company Name: Norman Bobrow & Co. Inc.
The impact of Hudson Yards has not been fully felt. Many tenants will leave the Midtown and Plaza Districts and cause a flood of space to enter the market. I also believe that the commitment of Amazon to Long Island City will not be positive for NYC as it will put pressure on transportation, housing and employment.
If the stock market does not improve, the real estate market has a tendency to follow six months later. I also believe that the amount of space that has been leased to coworking tenants has removed a lot of space from the market and is artificially going to drive up prices. I believe these types of users are going to fail. The office suites business was doing well and will continue as long as they too don't oversaturate themselves.


Mobile app industry is evolving with rapid speed, and it is no more a secret that every business needs to have a mobile app. Moreover, it is the most efficient channel to reach millions of users, the mobile app industry is taking over the market. There are almost 3.6 million Android apps in the Google Play Store and more than 2.2 million iOS apps in the Apple App Store. Besides, more than hundreds of apps get submitted to the respective app stores weekly. I can bet you that there are more than thousands of apps in the app stores just for your single need.
This extensive collection of apps give rise to fierce competition among the developers. In order to stand out of the crowd and grab the user's attention, you need to perform App Store Optimization. This technique is used to put the app on the top in app store search results and organic recommendations.
However, there are some common ASO(App Store Optimization) myths that restrict most of the users from successfully implementing the approach. Unfortunately, there are some misconceptions regarding the ASO that you need to avoid for achieving desirable results for your app.
We all know how important the app name is and we need to be very careful with that. Undoubtedly the name of the app is the best option to blend the keywords with other words smartly. By targeting the App title or name intelligently, you could get a number of users within in no time. However, there are some ASO experts who believe that changing the name of the app will get you better search ranking in the app stores. Frequently changing the name of the app will only cost you, an old user, nothing more. The users who want to reinstall your app or want to suggest to other will not be able to search it by the older name. As far as the App Stores algorithm goes, there is no benefit of changing the app's name again and again.
Most of the developers and marketers believe that ratings are the topmost factor that drives the app's search ranking. Yes, those people are right but up to some extent not entirely. The ratings on your app which is directly given by the user will definitely put the app in the better search result. But believing that only ratings alone will ball up your game is not right. The positions below 5 up to 10 are profoundly affected by the ratings, and you will see the apps ranking at 1,2,3, and four are having the same stars in the Google Play Store. This means among top 4 ranks the ratings alone isn't capable of selecting the best ones. This is where other factors like description, user feedbacks and much more come into play.
This is the most common myth among the app developers that cost them a considerable number of potential users. The app description is the primary place where the users know about your app. Besides, many surveys have proven that the users are most likely to decide whether they want to download the app or not on the basis of description. This makes it is necessary for you to take the description of your app seriously. Try to add as much as information about your app there but with the help of visuals like video or screenshots. Along with this also mention the additional features and rewards that user would acquire while using your app.
Most of the entrepreneurs aren't aware that the ASO is similar to SEO where you need to follow the specific guidelines. In the App Stores, you are also required to target specific keywords that will help you in acquiring the better ranking in the app stores. The specific and relevant keywords enable the apps to appear at better ranking in the searches. However, this doesn't mean you need to stuff the keywords unnecessarily as this will bring no good for you. You are required to sprinkle the keywords all over the content of your app with logic. While searching for an app in the store the users are most likely to type the keywords only of the type of app they are looking for.
Still, many app owners believe that getting your app submitted in the app store is enough. They think that the users will by default find the app and download it to push up their revenue graph. But, that's not true as you are competing among millions of apps in the app stores so you need be visible there. To garner the maxim number of users' attention you need to rank your app high in the app store search listings and featured categories. More importantly, should keep in mind that along with ASO you also have to promote your app via other mediums including social media platforms.


Odor Removal Done Right The First Time!
Any Odor – Every Time! We're Here To Help!
Let Us Stomp The Stink!
The Stink Stomper of Northern California's Odor Removal System completely eliminates funky odors at their source. We never use air fresheners of masking agents in our odor removal process, we offer a Complete Odor Removal & Indoor Air Quality Reset for your home or business.
Safe: All our odor removal products are free of harsh chemicals and are safe for use around people and pets.
Effective: You'll love the fresh, clean, back to neutral smell our process leaves behind.
Powerful: Our products don't mask odors. Instead, they penetrate right to the source of the odor and destroy it at the molecular level.
Cost Effective: You'll be surprised at how affordable it is to eliminate unpleasant odors—naturally!
Fast: In about 24 hours, the treated areas are ready for normal use!
If you're ready to get started or learn more, give us a call or fill out our online form today to schedule a free odor remediation inspection and quote.
If you have odors in your home that fragrances or houshold deodorizers just won't get rid of, it's time to call Stink Stompers. We don't cover up the odor - we eliminate it - every time - Guaranteed!
We can remove odors from Smoke, Tobacco, Marijuana Pets, Mildew, Cooking and more. Fast, Safe, Effective & Guaranteed!
Any Odor Removed in Your Home Every Time! 100% Guaranteed!
We provide odor removal vendor service for auto dealerships and private party vehicles of all kinds. We remove odors from tobacco, cigar, marijuana, vapes, pet, mildew, and more that even the best detailers leave behind.
We can permanently eliminate any odor every time in any vehicle, RV or boat. 100% Guaranteed! Most vehicles can be completely deodorized in as little as 1 hour.
Our service is very affordable and 100% Guaranteed. How can you go wrong?
We quickly and effeciently remove odors left behind by guests including body odors, moisture, food odors, tobacco and even marijuana and we never use ozone or toxic, temporary fragrances or other cover-ups.
All Odors Gone - Guaranteed!
Stink Stompers is your solution for deodorizing and sanitation. No odors and fresh and clean for your next guest. 100% Guaranteed.
No odor is too strong or funk to nasty for us to ELIMINATE.
Odor remediation is an essential service for nursing homes, rehab centers and private homes of people who are under convalescent care. Our epa approved process sanitizes, disinfects and removes every odor or every kind, everytime - Guaranteed!
Our Sanitizing & Deodorizing System uses a technologically advanced process to sanitize and deodorize areas without the need for toxic chemicals, fragrances or manual wiping and rinsing.
We sanitize a multitude of germs, allergens, odors and indoor contaminants.
Are You A Real Estate Professional? Check Out What We Can Do For You!


WASHINGTON--(BUSINESS WIRE)--GEICO is seeking applicants for its Veteran IT Transition Program.
Military veterans interested in rewarding careers in information technology (IT) are encouraged to apply. The program, based at GEICO headquarters in Chevy Chase, Maryland, combines 12 months of classroom work, mentoring and real-world experience to transform vets into full-time GEICO IT analysts. Vets are paid and receive benefits during the training process.
Applicants do not need previous tech experience or a college degree. Since the Veteran IT Transition Program launched in 2015, a steady stream of alumni have found rewarding and successful careers in GEICO's award-winning IT department.
"This program has been successful because veterans are results-oriented, adaptable and self-reliant. These are among the skills critical for those seeking a career in IT," GEICO Director of IT Talent Management Ted Robey said.
GEICO's connection to the military dates back to its founding in 1936; back then, the company exclusively offered policies to service members and government employees. The Veteran IT Transition Program is one of the many ways GEICO is keeping that connection strong. The company also offers special discounts for active duty service members and veterans and has a department dedicated to supporting the needs of the military community.
To apply for the program or to learn more, go to https://on.gei.co/ITVets.
GEICO is hiring military veterans to work in its cutting-edge IT department.


text:
Opera North brings back the classics in trailer for Little Greats season
6 July 2017 • 7:33am
Opera North
Autumn 2017 sees the return of a format Opera North first presented in 2004, for a new festival season of one act operas.
The Little Greats brings together six short operas, from the well-known to rarely performed jewels of the genre: Leoncavallo's Pagliacci, Mascagni's Cavalleria rusticana, Janáček's Destiny (Osud), Ravel's L'enfant et les sortilèges, Gilbert and Sullivan's Trial by Jury, and Leonard Bernstein's Trouble in Tahiti.
Ravel's L'enfant et les sortilèges
A company of artists has been assembled for The Little Greats season, all taking on multiple roles, including Giselle Allen, Peter Auty, Katie Bray, Richard Burkhard, Wallis Giunta, John Graham-Hall, Quirijn de Lang, Rosalind Plowright, Phillip Rhodes, John Savournin, Joseph Shovelton, Jonathan Stoughton, Ann Taylor, and Fflur Wyn.
In Leeds, the six operas will be presented in changing rotation, creating new and unusual pairings and allowing audiences to create their own path through the season. On tour in Hull, Nottingham, Newcastle and Salford the short operas will be presented in double bills. Discover more about The Little Greats season.
Mascagni's Cavalleria rusticana
For Winter 2018, Opera North's first ever production of Verdi's Un ballo in maschera sees the Company's former music director Richard Farnes return to conduct, in a production by Tim Albery with a cast including Rafael Rojas as Gustavo, Adrienn Miksch as Amelia, and Patricia Bardon as Madame Arvindson.
Winter 2018 also includes revivals of two of the most popular pieces in the repertoire. Puccini's Madama Butterfly is presented in a classic production by Tim Albery with Anne Sophie Duprels in the title role, while Alessandro Talevi's innovative take on Mozart's darkest work, Don Giovanni returns with William Dazeley in the title role.
Gilbert and Sullivan's Trial by Jury
The year ends with the continuation of Opera North's renowned series of dramatic concert stagings with Strauss's viscerally shocking Salome, with a cast including Jennifer Holloway, Robert Hayward and Katerina Karneus. Salome will open at Leeds Town Hall before touring to Edinburgh's Usher Hall, Warwick Arts Centre and Liverpool Philharmonic Hall.

redpajama_set_name: RedPajamaCommonCrawl


The Southwest Zone of USA Water Polo is holding elections for the Southwest Zone Board. There are three board positions up for election (seven total board positions). Overall there are seven spots on the Southwest Zone Board. I have attached the current Southwest Zone Policies & Procedures. Board eligibility and responsibilities are described in full within the attached Zone Policy document. All Southwest Zone information can also be found online at www.southwestwaterpolo.org. Below is brief summary of the election process, eligibility, obligations, and voter eligibility.
• Nominations for three zone board positions will be accepted beginning today, October 29th and ending Sunday, November 30th.
• Please submit nominations to southwestwaterpolo@earthlink.net.
• Self nominations are encouraged. Please only nominate a person if said person has agreed to fulfill the duties of the zone board position.
• Only current USA Water Polo members will then be able to vote from Saturday, December 20th to Tuesday, December 30th.
• The newly elected members of the Southwest Zone Board will be announced in January 2015.
• Outgoing Zone Board members: JT Wall and Scott Slay (can be nominated for re-election). Additionally, an extra Zone Board position has been created that needs to be filled in this election cycle.
• Continuing Zone Board members: Joe Linehan, Robert Albach, and Jimmy Linehan (positions up for election in 2016). Vern Heimbigner as the Southwest Zone Head Referee is automatically part of the Southwest Zone Board as per USA Water Polo by-laws. The Zone Head Referee position is appointed by USA Water Polo.
• Have principal place of residence within the Southwest Zone.
If you have any questions, please contact one of below Southwest Zone Board members who are handling the election process for 2014.


text:
Georgian Portable Cabinet
Other Travel Items Boxes
A Georgian mahogany Portable Cabinet made to be easily removed from its hanging.
This is an unusual piece of furniture and was likely to have been made for a specific purpose. The 4 strong brass fittings to the back show that it was meant to be hung and the strong brass carrying handles that it was to be moved. The cabinet could be dropped on to corresponding bolts fixed to a wall to support it but easily lifted off them to remove it. This would suggest a traveller and perhaps use on board ship or maybe a coach although this would be less likely as the bumpy roads would not be conducive to working. It is well made and the various compartments offer a mix of storage. To the centre is a fall, decorated with a carved line of cock beading to its edge, which is supported by 2 brass quadrants. Behind the fall is a full height central compartment flanked by 3 open drawers to each side. The vertical dividers are cut to a fine serpentine shape. The ends of the cabinet are rounded with a lid to the top of each side to access a plain storage space. Below each rounded side is a drawer which swings open. The right hand side is divided for 3 inkwell sized spaces with a larger compartment behind. The left hand side is divided for 8 baize lined compartments, 5 of which are square with the others reduced in size by the curve of the drawer front. The size of these compartments would take medicine bottles that would be typical of an apothecary box of the period. The cabinet has a central, plain drawer with a smaller drawer to either side. Both these smaller drawers have secret compartments. With the drawer fully removed, a secondary drawer to the back can be pulled out. To the left side the secret drawer is plain, to the right there are 10 coin holders cut out of the solid.
There are no definitive clues to the cabinet maker but to the back is a storage label for the company R. Strahan & Co. Ltd who had premises at Stephen's Green, Kingsbridge and Wentworth Place in Dublin. Strahan were established in 1776 as cabinet makers at Chancery Lane, extending to further workshops in Henry Street by 1815 and then Leinster Street by 1845. They made furniture for a number of the important Irish houses and showed at the International exhibitions in the 2nd half of the 19th century. Their expansion continued in the services they offered, one of which was removals and warehousing and perhaps it was this diversity that kept the business going until 1969. There is also a smaller label giving the name Bennett. The quality of the cabinet work on this piece is good, down to the detail of the locks cut to fit the rounded sides. Early 19th Century.
Depth 20 cm / 8"
ENQUIRE ABOUT GEORGIAN PORTABLE CABINET
Brass Bound Campaign Box
Small Leather Collar Box
Small Sized Collar Box
Red Round Collar Box
Milner's Double Plated Iron Portable Safety Box
Leather Horseshoe Collar Box
Leather Collar Box
Patent ABC Despatch Box by Jenner & Knewstub
China Trade Camphor Wood Writing Slope
Rosewood Campaign Box


text:
Q: Accessing variables from other classes in iOS I am really new to IOS developments. I know this is a silly question, but I really have no idea about this. I have two classes. lets assume A and B. in class A, I have a variable called x. I need to use this variable x in my class B. how can I do this?. please explain me with code samples
here is my code in login.h
#import <UIKit/UIKit.h>
#import "jsonpaser.h"
@interface LoginView : UIViewController
{
NSString* PERSON_ID;
}

@property (strong,nonatomic) IBOutlet UIScrollView *scroler;
@property (strong, nonatomic) IBOutlet UITextField *userName;
@property (strong, nonatomic) IBOutlet UITextField *passWord;
@property (strong,nonatomic) jsonpaser* jp;
@property(nonatomic,retain) NSString* PERSON_ID;

@end

in my login.m class there is a method.inside that method i set some value to my PERSONID variable
 PERSON_ID = [[responseObject valueForKey:@"d"]objectForKey:@"PersonId"];

here is my tableviewcontroler.h class
#import <UIKit/UIKit.h>
#import "LoginView.h"
@interface TableViewController : UITableViewController <UITableViewDataSource>
{
LoginView* classobj;
NSString* personIDFromLogin;
}

@property (strong,nonatomic) NSArray* googlePlaces;
@property (strong,nonatomic) NSArray* finishedArray;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton;
@property(retain,nonatomic) LoginView* classobj;
@property(retain,nonatomic) NSString* personIDFromLogin;
@end

this is my tableview.m class
- (void)viewDidLoad
{
[super viewDidLoad];

LoginView* login = [[LoginView alloc]init];
NSString* x = login.PERSON_ID;
NSLog(@"X Variable : %@",x);

NSString* webPath = @"GetAppointmentRequests";
NSString* webURL = [NSString stringWithFormat:@"%@%@",BaseURLString,webPath];
NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys:x,@"caregiverPersonId", nil];

NSLog(@"PARAMETERS :%@",personIDFromLogin);

jsonpaser* parser = [[jsonpaser alloc]init];
[parser getWebServiceResponce:webURL :params success:^(NSDictionary *responseObject){

}];

}

EDIT
i have solve my problem with below link... thank you everyone. sorry for my bad english and grammar mistakes.
refer this

A: Basically, you have to send the value of the variable when you are opening a new view i.e UITableViewController
On the TAB Button action
[self performSegueWithIdentifier:@"tableViewControllerSegue" sender:sender];

and in prepareForSegue: method just pass the variable value as
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"tableViewControllerSegue"])
    {   TableViewController *tableViewController = [segue destinationViewController];
        tableViewController.personIDFromLogin = PERSON_ID;
    }
}

redpajama_set_name: RedPajamaStackExchange


Abstract: The P4PA supports existing 400MHz based Pentium 4 processors, and goes an extra step further by including support for the up and coming 533MHz Pentium 4 processor.
VIA's movement into selling its own branded motherboards has been received farily well by the industry, and as the boards are produced by existing companies under licence, many of the early glitches you might expect from an upstart are thankfully absent.
The VIA mainboard we are examining today is the just released VIA P4PA which has a very FIC or Asus feel about it (we're not saying it was built by either of them because we really don't know), and it certainly performs like a champ!
The P4PA supports existing 400MHz based Pentium 4 processors, and goes an extra step further by including support for the up and coming 533MHz Pentium 4 processor. This is great for peace of mind in terms of upgradeability.
Two other forms of future-proofing are included on the VIA P4PA; an onboard network card, and USB2.0 controller. It's really sad to say that the MAC world has been beating PC's blindly on this front for many years. As broadband is the preferred means of connecting to the internet, NIC's (Network Interface Card) are basic required equipment these days. By including the NIC on the mainboard, and locating the RJ-45 jack just above the two USB ports, consumers can save a few dollars, and some time as they no longer have to buy and install the card in an empty PCI slot.
The onboard 10/100 Ethernet comes thanks to the RT8100A controller, and along with onboard audio using VIA's AC'97 codec, the VIA VT6202 chipset also brings support for USB2.0.
While the P4PA undoubtedly has many good features going for it, no mainboards can really be considered complete without an onboard IDE RAID controller. The P4PA lacks IDE RAID, which is a shame as most mainboards in the P4PA's class have it.
The VIA P4PA is based on the VIA Apollo P4X266A chipset which a good performer.
The P4PA comes packing three DDR DIMM slots (most Intel i845-D boards only have two) which support up to 3 GB of either PC1600/PC2100 DDR RAM that is non-ECC.
The general layout of the PCB is one of those things you don't notice until you try to install components. If the components are laid out poorly you may have problems installing items, or have to remove one component to reach another. This may seem trivial until you are behind your desk trying to install a new video card, then realize you have to remove all the memory first, or vice versa.


Whether you're married, in a new relationship, or just trying to break out of the friend zone, one of these date ideas is the perfect way to woo someone special in Toronto. From downtown to York, these unique destinations will have your date on their Toron-toes.
Want a date destination out of this world? Try the David Dunlap Observatory. Located on a large estate in North York, the observatory hosts frequent star-gazing events. You'll look like a serious romantic for proposing the idea, and the chilly air means you have no choice but to snuggle up in the dark. Others will be watching the falling stars through the telescope, but all you'll see is your date falling head over heels in love.
Are you still waiting for the end of the date to get hot and sweaty? Step up your game and head to a hot yoga class for couples. Explain that the point of attending the "8 Limbs, 2 Hearts" yoga course is to learn how to connect better as a couple. Then enjoy the fact that the date consists of wearing as little as possible and touching for the full 60 minutes. Yo-ganna love it!
The Rex, located in the Queen West neighbourhood of Toronto, is the perfect place to bring a date when you want to look cool and sophisticated. The Rex typically has two or three jazz shows per day, which means you don't have to do much planning in advance. Even better? The jazz shows are free, provided you are also enjoying a drink or two while you're there. All that sax can only lead to treble, right?
Don't think that dating ends once the snow arrives in Toronto. When winter hits TO, it's not unusual to go on several dates before you even know what someone looks like under their puffer jacket. Strip down and show them a seriously good time by heading to the heated pool at the Sheraton Hotel. A little known fact is that you don't have to be a guest of the hotel to swim, although you will have to pay a $35 entrance fee. Since the heated pool is outdoors, you can watch the stars as you swim. You won't be in hot water over this date choice–it's bound to go swimmingly!
Let's be honest: Sometimes dates need a little alcohol to keep them interesting. On Saturdays, Amsterdam Brewery offers a free tour for visitors that concludes with a much-needed beer tasting. The Mill Street Brew Pub, located in the appropriately named Distillery District, has daily tours. Your date will be impressed by your planning, it costs nothing, and you still get to drink a beer at the end of it. Win!
From heated swimming pools to star observatory outings, no one will be able to resist your charms on these dates. And if all else fails, you can drown your sorrows at the free brewery tour. Hop to it!
What are your favourite date ideas in Toronto?
Next 6 Sensational Stays in Vancouver, B.C.


text:
Q: VSTO Office Add In c# Reply to all doesn't always show/fire I'm building an add in for Outlook 2010, when a user clicks Reply to all I want a message box to show saying  'Are you sure?'. With so many users in our organisation too many click Reply to all not realising what they're doing.
This may look as overkill but we plan to count the number of recipients and have this show if its greater than X.
I'm using the following code, for some reason the message box only either shows once, or will randomly show each time.
Can anyone help?
private Outlook.Application _application = null;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    _application = Globals.ThisAddIn.Application;
    _application.ItemLoad += new Outlook.ApplicationEvents_11_ItemLoadEventHandler(_application_ItemLoad);
}

private void GenerateItemMessage(object item, string operation)
{
    MailItem mi = item as Outlook.MailItem;
    MessageBox.Show(String.Format("MailItem {0} will be {1}", mi.Subject, operation));
}

private void ThisAddIn_ReplyAll(object item, ref bool cancel)
{
    GenerateItemMessage(item, "ReplyToAll");
}

private void _application_ItemLoad(object Item)
{
    ((Outlook.ItemEvents_10_Event)Item).ReplyAll += new Outlook.ItemEvents_10_ReplyAllEventHandler(ThisAddIn_ReplyAll);
}

A: You must keep the source object alive if you want to handle events:
private void GenerateItemMessage(object item, string operation)
{
    MailItem mi = item as Outlook.MailItem;
    MessageBox.Show(String.Format("MailItem {0} will be {1}", mi.Subject, operation));
}

The scope of mi object is limited by the method where it is declared. The GC can swipe it from the heap at any point of time. So, you need to declare it at the global scope:
MailItem mi = null;
private void GenerateItemMessage(object item, string operation)
{
    mi = item as Outlook.MailItem;
    MessageBox.Show(String.Format("MailItem {0} will be {1}", mi.Subject, operation));
}

Or you may consider maintaining a list of objects if you going to handle many of them simultaneously.
You should DO so everywhere in the code, for example, looks like you didn't do so for the following sample:
private void _application_ItemLoad(object Item)
{
    ((Outlook.ItemEvents_10_Event)Item).ReplyAll += new Outlook.ItemEvents_10_ReplyAllEventHandler(ThisAddIn_ReplyAll);
}

You will not get the ReplyAll event fire after the _application_ItemLoad method finishes. You need to keep objects alive if you want to get events fired:
Outlook.ItemEvents_10_Event _item;
private void _application_ItemLoad(object Item)
{
    _item = (Outlook.ItemEvents_10_Event)Item;
    _item.ReplyAll += new Outlook.ItemEvents_10_ReplyAllEventHandler(ThisAddIn_ReplyAll);
}

A: Instead of ItemLoad (or in addition to), try to trap the Explorer.SelectionChange event and set up ReplyAll events handlers on the selected items.


Definition - What does Blistering mean?
Blistering is the formation of small to large, broken or unbroken bubbles, which are under or within a coating at the paint/metal interface. Although blisters can form between layers of paint, these are less common. Blisters are often liquid filled and may take the form of clusters (or rashes).
Blistering causes adhesion failure and is catastrophic, therefore blistering causes damage to the structure or metal surface, which may incur substantial loss.
Blistering is the result of adhesion failure in localized areas. They can be any size and distribution. Numerous factors can lead to blistering, but the most common is a contaminant of some kind left on the surface after cleaning.
When adhesion is poor, blisters that form can remove the coating from the substrate, either isolated as blisters, or by total delamination of the coating. Isolated water-filled blisters are usually formed in softer coatings. Once formed, blisters can grow during continued water exposure, for example, by osmotic effects.
To minimize blistering problems, a coating with very strong adhesion strength and low moisture vapor transfer rate should be used. A clean substrate with proper surface preparation and reduced soluble salt levels to suit service exposure are essential.
Blisters should not be broken unless it is to test them or their contents to determine cause. While they are abnormalities, blisters can still help protect the surface.


text:
class ApplicationHelper::Button::SecurityPolicyNew < ApplicationHelper::Button::ButtonNewDiscover
  def supports_button_action?
    ::EmsNetwork.all.any? { |ems| SecurityPolicy.class_by_ems(ems)&.supports?(:create) }
  end

  def role_allows_feature?
    super && role_allows?(:feature => 'ems_network_show_list') && role_allows?(:feature => 'security_policy_show_list')
  end

  def disabled?
    @error_message = _("No cloud providers support creating security policies.") unless supports_button_action?
    super || @error_message.present?
  end
end

redpajama_set_name: RedPajamaGithub


Flipper is already pretty optimized for production usage (flipper does billions of feature checks a day at GitHub), but the latest release (0.10.2) just received a couple new ones — all thanks to community contributions.
Would love if there's a way to preload enabled features for an actor. For Product Hunt, we check several features in a single request for current_user. With activerecord this adds up to quite a few queries. Would love to get it down to one.
From browsing source I don't believe this is currently available.
I suggested using caching, as we do at GitHub, but also put some thoughts down on how preloading features could work. @gshutler saw the conversation and put pen to paper on a great pull request that made the idea concrete.
Often times users of flipper do many feature checks per request. Normally, this would require a network call for each feature check, but flipper comes with a Memoizer middleware that stores the gate values for a feature in memory for the duration of a request. This makes it so the first feature check for a feature performs a network call, but subsequent ones just do in memory Hash fetches (aka dramatic hamster faster).
The addition by gshutler was an adapter method get_multi, which takes an array of features and allows the adapter to load all features in one network call. He then added DSL#preload, along with a :preload option for the Memoizer middleware, which use get_multi to load any provided features in one network call instead of N.
By default, the Adapter implementation of get_multi performs one get per feature. Each adapter can then override this functionality with a more efficient means of fetching the data. For example, the active record adapter uses an IN query to select all gate values for all features.
gshutler provided the redis implementation of get_multi and then I, as the maintainer of flipper, added get_multi for the other core adapters, along with updates to the Adapters and Optimizations documentation.
mscoutermarsh was kind enough to drop a graph of the result for an endpoint of Product Hunt.
I will leave it up to the reader to determine when he deployed the preloading. :) Looks like ~50% improvement on that endpoint.
I feel like this is a great example of the power of open source and how important it is to efficiently load data for requests, so I thought I would take the time to write it up. Hope you enjoyed it. Happy bulk loading!


text:
A common practice when administering web applications is to create a
copy/backup of a particular directory prior to making any
modification. Another common practice is to add an extension or change
the name of the original directory to signify that it is a backup
(examples include `.bak`, `.orig`, `.backup`, etc.).

During the
initial recon stages of an attack, cyber-criminals will attempt to
locate backup directories by adding common extensions onto directories
already discovered on the webserver. By analysing the response headers
from the server they are able to determine if a backup directory
exists. These backup directories can then assist in the compromise of
the web application.

By utilising the same method, the tool was able
to discover a possible backup directory.


Published 04/26/2019 02:52:50 am at 04/26/2019 02:52:50 am in Suction Cup Shower Speaker.
suction cup shower speaker sylvania sp230 white bluetooth suction cup shower speaker white gadgetree suction cup bluetooth speaker blue gadgetree brands gadgetree suction cup bluetooth speaker blue.
tmvel tire waterproof ipx rugged wireless portab on sale for tmvel tire waterproof ipx rugged wireless portable bluetooth speaker shower speaker with suction cup , audiostar a bluetooth shower speaker allinone the write choice bluetooth wireless shower speaker with suction cup , soundbot sb hd water resistant bluetooth shower speaker on sale, cyber week shopping special corelife bluetooth shower speaker corelife bluetooth shower speaker wireless waterproof bluetooth music player with suction cup and metal hook , pink subwoofer wireless bluetooth waterproof shower speaker mic pink subwoofer wireless bluetooth waterproof shower speaker mic suction cup, this is what people are buying on amazon right now waterproof house this waterproof bluetooth speaker that has a suction cup , amazon wireless bluetooth waterproof shower speaker only reg amazon wireless bluetooth waterproof shower speaker only reg , rage out bluetooth suction cup shower speakers dci pinterest rage out bluetooth suction cup shower speakers, holiday shopping sales for laud portable wireless shower speaker laud portable wireless shower speaker ipx waterproof super strong suction cup built, bluetooth shower radio laud portable shower speaker waterproof super bluetooth shower radio waterproof shower speakers shower radio with suction cup , winstion wireless bluetooth waterproof outdoor shower speaker with winstion wireless bluetooth waterproof outdoor shower speaker with w speakersuction cup with microphone handsfree speakerphone army green.


A second attempt by House Republicans to pass a controversial bill granting additional access to experimental drugs was successful late Wednesday, this time under looser rules allowing passage with a simple majority.
Earlier this month, the same so-called right-to-try legislation was narrowly defeated along party lines in a vote that would have required the support of two-thirds of the chamber.
As Politico reported, the bill passed this week with the support of 35 Democrats and all but two Republicans with a final vote of 267 to 149.
The bill would allow terminally ill patients who have exhausted other medical options to legally access experimental drugs that have not yet been approved by the Food and Drug Administration but have at least passed Phase 1 clinical studies.
Previous reports indicate the legislation does not, however, compel pharmaceutical companies to release these drugs to patients upon request.
This push for targeted deregulation has been popular among many prominent conservatives and has been a central mission for the Goldwater Institute, an Arizona-based libertarian think tank.
Senators voted to pass a related bill last year and President Donald Trump has already expressed his eagerness to ultimately sign such legislation into law.
"Patients with terminal conditions, terminal illness, should have access to experimental treatment immediately that could potentially save their lives," Trump said earlier this year during his first State of the Union address.
Vice President Mike Pence is also in favor of the legislation. As governor of Indiana in 2015, he signed that state's version of a right-to-try bill into law.
Do you think this is positive legislation?
The bill continues to find opposition, though, with even some lawmakers who might be inclined to support expanded availability of experimental drugs arguing bureaucratic deregulation is not an effective way to accomplish the goal.
Some of his Republican counterparts, like Rep. Joe Barton of Texas, say the bill is better than doing nothing.
"When you have no hope, perhaps false hope is better than no hope at all," he said.
Away from Capitol Hill, the debate continues with some critics of the measure expressing fear that this might signal further weakening of the FDA.
Some of those patients disagree, including Frank Mongiello, who is living with Lou Gehrig's disease and wants to expand access to experimental treatments.