var img$2 = "data:image/png;base64,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";

var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABHCAQAAAA6ywgFAAAAAmJLR0QA/4ePzL8AAAAHdElNRQfnDB0MKR9gQoijAAAJJElEQVRo3u2Ye1yUVRrHv+8MjCMwcgdFuSgQEaiFgKhslq6s1cZafjatsItrmes1LQ3DCi+xrZeyXLdS05Y1UfO+iZmIFIKpoGigIAYqInIX0HSAOfsHMAwwA6/GXv6Y3/z1nvec5/nO85zznPMeMMsss8wyyyyzzDLLrP9jSfK6ZVKGOxbd5raBBix4oLsAv8GWsdRa6dQy/08XEijuSDf3U8XzXfaVFRQ1fVRTX5o4UeWE6BZCqb5q1vZen9/Rdt1VFmAKGcMTV5636R46AAmf0H5X83Z13VMhx1wh1/qV2egQ9/xrLx0V6tvBe2T4lhVBHTqBkLugOsqFqTjrMQX7SAIEMjLcjQsTABVKGjs4tudl+hs8F5OE3AIiE7BrY7aEMgJfrPmFfI7yI1Xd8pe7JYIKHmY2I7HXt9wglY9JohGAeopRGaS4pvsBO1u/SqKIxbP5qRElYMsTPMQSNlAPFBGFpcGI8v9uBCOJow9wgx9IpxwHhvIwDrixlFo2A1oK79n6r56D/YmmD3COWBKbk2fDGN5lMI4sIIPzd2mxrWTVwc70NEFAEXPZqp9bdexiNj8DgTxjAkVu0f+Vc9CW36EENvNduzcpbCQWBRH8nTKTdjOwpAotJZSgxo08ou8GMBuBlqBOevTGB6jkQPN6NdRBptOb/vTtBNAWjx4FmlI7pQJJ4cpV3UXZETyBF4lMow7BJJMzxg4NUM1VI++KqaQ31gbFp72s8Va+8V5WZINdtaJacrUe/3pBB0CjczATHVk4Y+019fW3FlRaqEy60CEABUoj75QoAIHO5Gg1KHODDz9wxO1070JXi6sDDg7v0KcDYB4zuIICjd9ry1Yc+ueq42MdLJQm52AlVYAjA4y888IZqOmi6gldU3acCNv8+uUo0joHTMOXWlydZ8z76EDCwnTvUhoaO1twJeQAGp5G3e6NJU/jCOQaTX9HKUSV7/sDVVwhmjxTgKnYIDEkPG7XtuXpXtV0Xa1uspfbwHii2qRZ4o88C9Szj2pZgKXStkkfJ86McXPS4suPxgD3oWKgMuaFjVsSR5S2IzMN+i+SATuWEU1/VCiwxIN5/BVn4Cg7ZeEB1HGib8KSuK0eoRKuHG1u1a/iDOwZQMxrOz/IsTYcJiSkzspqGUvwIAAX3mECpynHgcH4owLyWSIzwa3WDo2q+DpuvldCIScIMQScjQvvPbY9ti2eDU430HVe9dOZSRyhWBJIoEH7Kd4m+a7wALQcd9euicMrQZDHfS2AufyInduHsecdW7uq8C0fsiVkraSdhE2nRpOZxBT+gBc9mp1cYR/ryJEBJOiJ5y9Xe1YbtGQ5quI+yV10KrQ1gu74Mfe5n0Ja9wMHwr4bFTsvbYWQs29e4G02EIQvvagln1PkUy8rYkLyKZ86PWtI+svnnFtO4jqyvDzeWReVdVMPmEGNzcTICv0w58aIz2a8u7v8QvNG1zViA3ltyoNc2Sld9kzbJrav3n1oaeqoljje5vTYDSOr9p9rWcVFHOxb6ttS89WMPrAqOq9cQyOjm5q654u9raRGchhyIWzjKipESfqC5yPibfWRKFZnRyxFagG8xmWLG/oF40LojuU1DcTgD4AFFrruRxRaBZX1Qxf9/tiLFNNITslr80MyW+reL1wPFOralhRrUDRPcIBaCn0/5hxpNO2N3ljleBTV9dPdJYJJNBR4VlgffgaVqC0rQEUYufhByYyf0obcau5zQ6mVbrUAemBf6VyGU9NTFcmvLD/rv+Vb4gkgiGfxPq2dfGpYnfj1YWzKYU8pKGPe0Vzub27NJo7VBLgtC7jd3CJhL1RCXz3yENKLa630VwEKMajijbnXNTFksIP91DHZ6Inl3vUKBfqDQQrFzCfJdeJWWz2BtfjTR5Df0v0Yy1gzfFC54X1F34an9q18RFi8yREcOac3vYtGXmUlt0jvBtBj1PA5grUjH0+2NfDuc/ODiLdbAZtiOH2Ja5srlR7i/qoJm/8SUaLxZT0nEFwEUilVrIxcHwJfIu6ptDSpgFc4yXIg4f6pqwaVqQw8q8XEvTVWbfahZLaSYTsh3qHdvY9aeNc9duSNNzcHCbWK9/mGYwjlmN3B16e9m9jPh8N8wcW7RLsAZLKJMETPz4a/ujq00LaNT4UYfmnD0Bg+bztsPV/yfZ9n4107XGMphZMYXPrkgVkLV49MdRUWELJDEo7i0dMxk4t6LeA0B2WBXaKYs+wlFhVCnTB44exxiQFVmnbeFGLQtcVPgeBKewN/YyNnNNMWB9RYGLlDUwp74Vs3Invi13PeCs9qMuVePy5x+Wih/AhBVhd4X7AdEJZJ7qt+O3PRkwceKnURHf2oxNDC2KegiLPGjexAKFdEPpHu2iiZuOyzFPZCY2DQv/qFz+IDYQf3caYTwO3scZu7aNw3wy4MuGUnlEZtu4jII2vD4DJJpswc4TzjSXeaO/ORs646haz7SRsx9NKcmBS3SJL52iTgBuJDgm6YtqgRwQUzF6Y5z0KQ0Vkq8oGdwEG3+X+OSPG+ZSUL0lmMPhn9XGqP7Sbt7iPFeUSOsbGSsBfBRS9/uCkAtrFYzjHtHIJtDCK/14rHotaE53rWWwmpC0QnEfX9Xtd4kzbPIHqM29s+tWrhqR2VNWvxloGCTxAdjrgmPtz9gZ8I50JNVWJ84hH3Y8G5D18edt2vzK6W20YOXz3xLx22KfzThOvRmJIW6c6r2VZP1gIgYYWj1u1nz5TAb8ekhV0PpJBgCnhUHiBAIDAPF36m9krFlU278uxS/XIHFgdfC6j0vuRSoWw14XlzyM4xa6Yc/wdfMcukPTsm45RpSwN2wqnCNdfjuPf3Dx5/vHgO5Qhy2lwSt0rW7l9IHsFkkM+37KZSc6xf3LrUEQKQ6K178IfwDxfu/6D+JQoJ69TOFyj9D72lLO+b4Zc9uqBvzRyG8QAl9MdHDoYcUEEBSQgpZIckELbiN3lzp2c6TCGZr7gky4aQYArrOcwdUmT0v6sbVi8AtoFCKHriUzY0fuza8RdH4o99h7ljTJk0kiay0fJQ90TMuPYilFGbJuz5NFxI6xCdFuf/iU5yRtrvXmodSwEH/uPe7uGIfBIN51GhxU9/IjbLLLPMMqV/Ax6WGng55bL/AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIzLTEyLTI5VDEyOjI3OjAxKzAwOjAwzOSVLQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMy0xMi0yOVQxMjoyNzowMSswMDowML25LZEAAAAodEVYdGRhdGU6dGltZXN0YW1wADIwMjMtMTItMjlUMTI6NDE6MzErMDA6MDCBiLGpAAAAAElFTkSuQmCC";

var en$1 = {
	"cameraselector.entry.name": "Camera Selector",
	"cameraselector.entry.description": "Make the camera selectable. This is an extension to help with extensions that use all cameras."
};
var ja$1 = {
	"cameraselector.entry.name": "カメラセレクター",
	"cameraselector.entry.description": "使うカメラを選ぶ。"
};
var translations$1 = {
	en: en$1,
	ja: ja$1,
	"ja-Hira": {
	"cameraselector.entry.name": "かめらせれくたー",
	"cameraselector.entry.description": "つかうかめらをえらぶ。"
}
};

var formatMessage$1 = function formatMessage(messageData) {
  return messageData.defaultMessage;
};
var setFormatter = function setFormatter(formatter) {
  return formatMessage$1 = formatter;
};
var message = function message(key) {
  var id = "".concat(entry.extensionId, ".entry.").concat(key);
  var defaultMessage = translations$1[id] || translations$1.ja[id];
  var description = "".concat(key, " of the extension");
  return formatMessage$1({
    id: id,
    defaultMessage: defaultMessage,
    description: description
  });
};
var entry = {
  get name() {
    return message('name');
  },
  get description() {
    return message('description');
  },
  extensionId: 'cameraselector',
  extensionURL: 'https://tfabworks.github.io/xcx-cameraselector/dist/cameraselector.mjs',
  collaborator: 'TFabWorks',
  iconURL: img$2,
  insetIconURL: img$1,
  featured: true,
  disabled: false,
  bluetoothRequired: false,
  internetConnectionRequired: false,
  helpLink: 'https://tfabworks.github.io/xcx-cameraselector/',
  translationMap: translations$1
};

/**
 * This is an extension for Xcratch
 */
Object.assign(entry, {
  setFormatMessage: function setFormatMessage(formatter) {
    return setFormatter(formatter);
  }
});

function _typeof$1(obj) {
  "@babel/helpers - typeof";

  return _typeof$1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
    return typeof obj;
  } : function (obj) {
    return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  }, _typeof$1(obj);
}

function _toPrimitive(input, hint) {
  if (_typeof$1(input) !== "object" || input === null) return input;
  var prim = input[Symbol.toPrimitive];
  if (prim !== undefined) {
    var res = prim.call(input, hint || "default");
    if (_typeof$1(res) !== "object") return res;
    throw new TypeError("@@toPrimitive must return a primitive value.");
  }
  return (hint === "string" ? String : Number)(input);
}

function _toPropertyKey(arg) {
  var key = _toPrimitive(arg, "string");
  return _typeof$1(key) === "symbol" ? key : String(key);
}

function _defineProperty(obj, key, value) {
  key = _toPropertyKey(key);
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }
  return obj;
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;
  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  return arr2;
}

function _arrayWithoutHoles(arr) {
  if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}

function _iterableToArray(iter) {
  if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}

function _unsupportedIterableToArray(o, minLen) {
  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = Object.prototype.toString.call(o).slice(8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return Array.from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _nonIterableSpread() {
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}

function _toConsumableArray(arr) {
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}
function _asyncToGenerator(fn) {
  return function () {
    var self = this,
      args = arguments;
    return new Promise(function (resolve, reject) {
      var gen = fn.apply(self, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(undefined);
    });
  };
}

function _arrayWithHoles(arr) {
  if (Array.isArray(arr)) return arr;
}

function _iterableToArrayLimit(arr, i) {
  var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
  if (null != _i) {
    var _s,
      _e,
      _x,
      _r,
      _arr = [],
      _n = !0,
      _d = !1;
    try {
      if (_x = (_i = _i.call(arr)).next, 0 === i) {
        if (Object(_i) !== _i) return;
        _n = !1;
      } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);
    } catch (err) {
      _d = !0, _e = err;
    } finally {
      try {
        if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return;
      } finally {
        if (_d) throw _e;
      }
    }
    return _arr;
  }
}

function _nonIterableRest() {
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}

function _slicedToArray(arr, i) {
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
}

function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}

function _defineProperties(target, props) {
  for (var i = 0; i < props.length; i++) {
    var descriptor = props[i];
    descriptor.enumerable = descriptor.enumerable || false;
    descriptor.configurable = true;
    if ("value" in descriptor) descriptor.writable = true;
    Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
  }
}
function _createClass(Constructor, protoProps, staticProps) {
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  if (staticProps) _defineProperties(Constructor, staticProps);
  Object.defineProperty(Constructor, "prototype", {
    writable: false
  });
  return Constructor;
}

var regeneratorRuntime$1 = {exports: {}};

var _typeof = {exports: {}};

(function (module) {
  function _typeof(obj) {
    "@babel/helpers - typeof";

    return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
      return typeof obj;
    } : function (obj) {
      return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
    }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
  }
  module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
})(_typeof);

(function (module) {
  var _typeof$1 = _typeof.exports["default"];
  function _regeneratorRuntime() {

    /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
    module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
      return exports;
    }, module.exports.__esModule = true, module.exports["default"] = module.exports;
    var exports = {},
      Op = Object.prototype,
      hasOwn = Op.hasOwnProperty,
      defineProperty = Object.defineProperty || function (obj, key, desc) {
        obj[key] = desc.value;
      },
      $Symbol = "function" == typeof Symbol ? Symbol : {},
      iteratorSymbol = $Symbol.iterator || "@@iterator",
      asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
      toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
    function define(obj, key, value) {
      return Object.defineProperty(obj, key, {
        value: value,
        enumerable: !0,
        configurable: !0,
        writable: !0
      }), obj[key];
    }
    try {
      define({}, "");
    } catch (err) {
      define = function define(obj, key, value) {
        return obj[key] = value;
      };
    }
    function wrap(innerFn, outerFn, self, tryLocsList) {
      var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
        generator = Object.create(protoGenerator.prototype),
        context = new Context(tryLocsList || []);
      return defineProperty(generator, "_invoke", {
        value: makeInvokeMethod(innerFn, self, context)
      }), generator;
    }
    function tryCatch(fn, obj, arg) {
      try {
        return {
          type: "normal",
          arg: fn.call(obj, arg)
        };
      } catch (err) {
        return {
          type: "throw",
          arg: err
        };
      }
    }
    exports.wrap = wrap;
    var ContinueSentinel = {};
    function Generator() {}
    function GeneratorFunction() {}
    function GeneratorFunctionPrototype() {}
    var IteratorPrototype = {};
    define(IteratorPrototype, iteratorSymbol, function () {
      return this;
    });
    var getProto = Object.getPrototypeOf,
      NativeIteratorPrototype = getProto && getProto(getProto(values([])));
    NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
    var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
    function defineIteratorMethods(prototype) {
      ["next", "throw", "return"].forEach(function (method) {
        define(prototype, method, function (arg) {
          return this._invoke(method, arg);
        });
      });
    }
    function AsyncIterator(generator, PromiseImpl) {
      function invoke(method, arg, resolve, reject) {
        var record = tryCatch(generator[method], generator, arg);
        if ("throw" !== record.type) {
          var result = record.arg,
            value = result.value;
          return value && "object" == _typeof$1(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
            invoke("next", value, resolve, reject);
          }, function (err) {
            invoke("throw", err, resolve, reject);
          }) : PromiseImpl.resolve(value).then(function (unwrapped) {
            result.value = unwrapped, resolve(result);
          }, function (error) {
            return invoke("throw", error, resolve, reject);
          });
        }
        reject(record.arg);
      }
      var previousPromise;
      defineProperty(this, "_invoke", {
        value: function value(method, arg) {
          function callInvokeWithMethodAndArg() {
            return new PromiseImpl(function (resolve, reject) {
              invoke(method, arg, resolve, reject);
            });
          }
          return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
        }
      });
    }
    function makeInvokeMethod(innerFn, self, context) {
      var state = "suspendedStart";
      return function (method, arg) {
        if ("executing" === state) throw new Error("Generator is already running");
        if ("completed" === state) {
          if ("throw" === method) throw arg;
          return doneResult();
        }
        for (context.method = method, context.arg = arg;;) {
          var delegate = context.delegate;
          if (delegate) {
            var delegateResult = maybeInvokeDelegate(delegate, context);
            if (delegateResult) {
              if (delegateResult === ContinueSentinel) continue;
              return delegateResult;
            }
          }
          if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
            if ("suspendedStart" === state) throw state = "completed", context.arg;
            context.dispatchException(context.arg);
          } else "return" === context.method && context.abrupt("return", context.arg);
          state = "executing";
          var record = tryCatch(innerFn, self, context);
          if ("normal" === record.type) {
            if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
            return {
              value: record.arg,
              done: context.done
            };
          }
          "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
        }
      };
    }
    function maybeInvokeDelegate(delegate, context) {
      var methodName = context.method,
        method = delegate.iterator[methodName];
      if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
      var record = tryCatch(method, delegate.iterator, context.arg);
      if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
      var info = record.arg;
      return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
    }
    function pushTryEntry(locs) {
      var entry = {
        tryLoc: locs[0]
      };
      1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
    }
    function resetTryEntry(entry) {
      var record = entry.completion || {};
      record.type = "normal", delete record.arg, entry.completion = record;
    }
    function Context(tryLocsList) {
      this.tryEntries = [{
        tryLoc: "root"
      }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
    }
    function values(iterable) {
      if (iterable) {
        var iteratorMethod = iterable[iteratorSymbol];
        if (iteratorMethod) return iteratorMethod.call(iterable);
        if ("function" == typeof iterable.next) return iterable;
        if (!isNaN(iterable.length)) {
          var i = -1,
            next = function next() {
              for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
              return next.value = undefined, next.done = !0, next;
            };
          return next.next = next;
        }
      }
      return {
        next: doneResult
      };
    }
    function doneResult() {
      return {
        value: undefined,
        done: !0
      };
    }
    return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
      value: GeneratorFunctionPrototype,
      configurable: !0
    }), defineProperty(GeneratorFunctionPrototype, "constructor", {
      value: GeneratorFunction,
      configurable: !0
    }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
      var ctor = "function" == typeof genFun && genFun.constructor;
      return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
    }, exports.mark = function (genFun) {
      return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
    }, exports.awrap = function (arg) {
      return {
        __await: arg
      };
    }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
      return this;
    }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
      void 0 === PromiseImpl && (PromiseImpl = Promise);
      var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
      return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
        return result.done ? result.value : iter.next();
      });
    }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
      return this;
    }), define(Gp, "toString", function () {
      return "[object Generator]";
    }), exports.keys = function (val) {
      var object = Object(val),
        keys = [];
      for (var key in object) keys.push(key);
      return keys.reverse(), function next() {
        for (; keys.length;) {
          var key = keys.pop();
          if (key in object) return next.value = key, next.done = !1, next;
        }
        return next.done = !0, next;
      };
    }, exports.values = values, Context.prototype = {
      constructor: Context,
      reset: function reset(skipTempReset) {
        if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
      },
      stop: function stop() {
        this.done = !0;
        var rootRecord = this.tryEntries[0].completion;
        if ("throw" === rootRecord.type) throw rootRecord.arg;
        return this.rval;
      },
      dispatchException: function dispatchException(exception) {
        if (this.done) throw exception;
        var context = this;
        function handle(loc, caught) {
          return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
        }
        for (var i = this.tryEntries.length - 1; i >= 0; --i) {
          var entry = this.tryEntries[i],
            record = entry.completion;
          if ("root" === entry.tryLoc) return handle("end");
          if (entry.tryLoc <= this.prev) {
            var hasCatch = hasOwn.call(entry, "catchLoc"),
              hasFinally = hasOwn.call(entry, "finallyLoc");
            if (hasCatch && hasFinally) {
              if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
              if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
            } else if (hasCatch) {
              if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
            } else {
              if (!hasFinally) throw new Error("try statement without catch or finally");
              if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
            }
          }
        }
      },
      abrupt: function abrupt(type, arg) {
        for (var i = this.tryEntries.length - 1; i >= 0; --i) {
          var entry = this.tryEntries[i];
          if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
            var finallyEntry = entry;
            break;
          }
        }
        finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
        var record = finallyEntry ? finallyEntry.completion : {};
        return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
      },
      complete: function complete(record, afterLoc) {
        if ("throw" === record.type) throw record.arg;
        return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
      },
      finish: function finish(finallyLoc) {
        for (var i = this.tryEntries.length - 1; i >= 0; --i) {
          var entry = this.tryEntries[i];
          if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
        }
      },
      "catch": function _catch(tryLoc) {
        for (var i = this.tryEntries.length - 1; i >= 0; --i) {
          var entry = this.tryEntries[i];
          if (entry.tryLoc === tryLoc) {
            var record = entry.completion;
            if ("throw" === record.type) {
              var thrown = record.arg;
              resetTryEntry(entry);
            }
            return thrown;
          }
        }
        throw new Error("illegal catch attempt");
      },
      delegateYield: function delegateYield(iterable, resultName, nextLoc) {
        return this.delegate = {
          iterator: values(iterable),
          resultName: resultName,
          nextLoc: nextLoc
        }, "next" === this.method && (this.arg = undefined), ContinueSentinel;
      }
    }, exports;
  }
  module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
})(regeneratorRuntime$1);

// TODO(Babel 8): Remove this file.

var runtime = regeneratorRuntime$1.exports();
var regenerator = runtime;

// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=
try {
  regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
  if ((typeof globalThis === "undefined" ? "undefined" : _typeof$1(globalThis)) === "object") {
    globalThis.regeneratorRuntime = runtime;
  } else {
    Function("r", "regeneratorRuntime = r")(runtime);
  }
}

/**
 * Types of block
 * @enum {string}
 */
var BlockType = {
  /**
   * Boolean reporter with hexagonal shape
   */
  BOOLEAN: 'Boolean',
  /**
   * A button (not an actual block) for some special action, like making a variable
   */
  BUTTON: 'button',
  /**
   * Command block
   */
  COMMAND: 'command',
  /**
   * Specialized command block which may or may not run a child branch
   * The thread continues with the next block whether or not a child branch ran.
   */
  CONDITIONAL: 'conditional',
  /**
   * Specialized hat block with no implementation function
   * This stack only runs if the corresponding event is emitted by other code.
   */
  EVENT: 'event',
  /**
   * Hat block which conditionally starts a block stack
   */
  HAT: 'hat',
  /**
   * Specialized command block which may or may not run a child branch
   * If a child branch runs, the thread evaluates the loop block again.
   */
  LOOP: 'loop',
  /**
   * General reporter with numeric or string value
   */
  REPORTER: 'reporter'
};
var blockType = BlockType;

/**
 * Block argument types
 * @enum {string}
 */
var ArgumentType = {
  /**
   * Numeric value with angle picker
   */
  ANGLE: 'angle',
  /**
   * Boolean value with hexagonal placeholder
   */
  BOOLEAN: 'Boolean',
  /**
   * Numeric value with color picker
   */
  COLOR: 'color',
  /**
   * Numeric value with text field
   */
  NUMBER: 'number',
  /**
   * String value with text field
   */
  STRING: 'string',
  /**
   * String value with matrix field
   */
  MATRIX: 'matrix',
  /**
   * MIDI note number with note picker (piano) field
   */
  NOTE: 'note',
  /**
   * Inline image on block (as part of the label)
   */
  IMAGE: 'image'
};
var argumentType = ArgumentType;

var en = {
	"cameraselector.name": "Camera Selector",
	"cameraselector.deviceName": "Device name",
	"cameraselector.selectCamera": "Set camera to [LIST]",
	"cameraselector.deviceLabelDefault": "Standard Camera",
	"cameraselector.deviceLabelUser": "Standard Front Camera",
	"cameraselector.deviceLabelEnvironment": "Standard Back Camera",
	"cameraselector.deviceLabelLeft": "Standard Left Camera",
	"cameraselector.deviceLabelRight": "Standard Right Camera"
};
var ja = {
	"cameraselector.name": "カメラセレクター",
	"cameraselector.deviceName": "デバイス名",
	"cameraselector.selectCamera": "カメラを[LIST]に切り替える",
	"cameraselector.deviceLabelDefault": "標準カメラ",
	"cameraselector.deviceLabelUser": "標準前面カメラ",
	"cameraselector.deviceLabelEnvironment": "標準背面カメラ",
	"cameraselector.deviceLabelLeft": "標準左カメラ",
	"cameraselector.deviceLabelRight": "標準右カメラ"
};
var translations = {
	en: en,
	ja: ja,
	"ja-Hira": {
	"cameraselector.name": "かめらせれくたー",
	"cameraselector.deviceName": "でばいすめい",
	"cameraselector.selectCamera": "かめらを[LIST]にきりかえる",
	"cameraselector.deviceLabelDefault": "ひょうじゅんかめら",
	"cameraselector.deviceLabelUser": "まえめんかめら",
	"cameraselector.deviceLabelEnvironment": "はいめんかめら",
	"cameraselector.deviceLabelLeft": "ひだりかめら",
	"cameraselector.deviceLabelRight": "みぎかめら"
},
	"zh-cn": {
	"cameraselector.name": "相机选择器",
	"cameraselector.deviceName": "设备名称",
	"cameraselector.selectCamera": "切换相机至[LIST]",
	"cameraselector.deviceLabelDefault": "标准相机",
	"cameraselector.deviceLabelUser": "标准前置摄像头",
	"cameraselector.deviceLabelEnvironment": "标准后置摄像头",
	"cameraselector.deviceLabelLeft": "标准左侧摄像头",
	"cameraselector.deviceLabelRight": "标准右侧摄像头"
},
	"zh-tw": {
	"cameraselector.name": "相機選擇器",
	"cameraselector.deviceName": "設備名稱",
	"cameraselector.selectCamera": "切换相机至[LIST]",
	"cameraselector.deviceLabelDefault": "標準相機",
	"cameraselector.deviceLabelUser": "標準前置攝像頭",
	"cameraselector.deviceLabelEnvironment": "標準後置攝像頭",
	"cameraselector.deviceLabelLeft": "標準左側攝像頭",
	"cameraselector.deviceLabelRight": "標準右側攝像頭"
}
};

var img = "data:image/png;base64,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";

/**
 * Formatter which is used for translation.
 * This will be replaced which is used in the runtime.
 * @param {object} messageData - format-message object
 * @returns {string} - message for the locale
 */
var formatMessage = function formatMessage(messageData) {
  return messageData.defaultMessage;
};

/**
 * Setup format-message for this extension.
 */
var setupTranslations = function setupTranslations() {
  var localeSetup = formatMessage.setup ? formatMessage.setup() : null;
  if (localeSetup && localeSetup.translations[localeSetup.locale]) {
    Object.assign(localeSetup.translations[localeSetup.locale], translations[localeSetup.locale]);
  }
};
var EXTENSION_ID = 'cameraselector';

/**
 * URL to get this extension as a module.
 * When it was loaded as a module, 'extensionURL' will be replaced a URL which is retrieved from.
 * @type {string}
 */
var extensionURL = 'https://tfabworks.github.io/xcx-cameraselector/dist/cameraselector.mjs';

/**
 * Scratch 3.0 blocks for example of Xcratch.
 */
var ExtensionBlocks = /*#__PURE__*/function () {
  /**
   * Construct a set of blocks for CameraSelector.
   * @param {Runtime} runtime - the Scratch 3.0 runtime.
   */
  function ExtensionBlocks(runtime) {
    _classCallCheck(this, ExtensionBlocks);
    /**
     * The Scratch 3.0 runtime.
     * @type {Runtime}
     */
    this.runtime = runtime;
    if (runtime.formatMessage) {
      // Replace 'formatMessage' to a formatter which is used in the runtime.
      formatMessage = runtime.formatMessage;
    }

    /**
     * 利用可能なビデオデバイスリスト
     * @type {InputDeviceInfo[]}
     */
    this._videoDevices = [];

    /**
     * 使用したいビデオデバイスの条件
     * @type {MediaTrackConstraints | {label?: string}}
     */
    this._desiredVideoTrackConstraints = {};

    // Video 関連の監視を開始する
    this._registerListeners();
    window.cameraselector = this; // DEBUG
  }

  /**
   * @returns {object} metadata for this extension and its blocks.
   */
  _createClass(ExtensionBlocks, [{
    key: "getInfo",
    value: function getInfo() {
      setupTranslations();
      return {
        id: ExtensionBlocks.EXTENSION_ID,
        name: ExtensionBlocks.EXTENSION_NAME,
        extensionURL: ExtensionBlocks.extensionURL,
        blockIconURI: img,
        showStatusButton: false,
        blocks: [{
          opcode: 'selectCamera',
          blockType: blockType.COMMAND,
          text: formatMessage({
            id: 'cameraselector.selectCamera',
            default: translations.en['cameraselector.selectCamera'],
            description: 'select the video device'
          }),
          arguments: {
            LIST: {
              type: argumentType.STRING,
              defaultValue: this._DEVICE_LABEL_DEFAULT,
              menu: 'videoDevicesMenu'
            }
          }
        }],
        menus: {
          videoDevicesMenu: {
            acceptReporters: true,
            items: 'getVideoDevicesMenu'
          }
        }
      };
    }
  }, {
    key: "selectCamera",
    value: function selectCamera(args) {
      var label = args.LIST || args.LABEL || '';
      /** @type {MediaStreamConstraints & {label?:string}}*/
      var constraints = {};
      if (label) {
        if (label === this._DEVICE_LABEL_DEFAULT) ; else if (this._supportedFacingModes.includes("user") && this._STANDARD_DEVICE_LABELS.user.includes(label)) {
          constraints.facingMode = {
            ideal: "user"
          };
        } else if (this._supportedFacingModes.includes("environment") && this._STANDARD_DEVICE_LABELS.environment.includes(label)) {
          constraints.facingMode = {
            ideal: "environment"
          };
        } else if (this._supportedFacingModes.includes("left") && this._STANDARD_DEVICE_LABELS.left.includes(label)) {
          constraints.facingMode = {
            ideal: "left"
          };
        } else if (this._supportedFacingModes.includes("right") && this._STANDARD_DEVICE_LABELS.right.includes(label)) {
          constraints.facingMode = {
            ideal: "right"
          };
        } else {
          constraints.label = label;
        }
      }
      // デバイスリストを探して見つかる場合その deviceId を条件に使う
      var dev = this._findVideoDevice(constraints);
      if (dev && dev.deviceId) {
        constraints.deviceId = dev.deviceId;
      }
      this._desiredVideoTrackConstraints = constraints;
      if (this.runtime.ioDevices.video.videoReady) {
        // 既存のビデオストリームを差し替える
        return this._openVideoStream(this._video).then(function () {});
      } else {
        // 自動的にカメラをONにする
        return this.runtime.ioDevices.video.enableVideo().then(function () {});
      }
    }
  }, {
    key: "getVideoDevicesMenu",
    value: function getVideoDevicesMenu() {
      var defaultValues = [{
        text: this._DEVICE_LABEL_DEFAULT,
        value: this._DEVICE_LABEL_DEFAULT
      }];
      // まだテストが不十分なので隠しておく
      // Constraints に対応するデバイスが見つからなかった場合に OverconstrainedError が発生する際の問題があるので使えると分かってるときのみ使用する
      // if (navigator.mediaDevices.getSupportedConstraints().facingMode) {
      //   if (this._supportedFacingModes.includes("user")) {
      //     defaultValues.push({ text: this._DEVICE_LABEL_USER, value: this._DEVICE_LABEL_USER })
      //   }
      //   if (this._supportedFacingModes.includes("environment")) {
      //     defaultValues.push({ text: this._DEVICE_LABEL_ENVIRONMENT, value: this._DEVICE_LABEL_ENVIRONMENT })
      //   }
      //   if (this._supportedFacingModes.includes("left")) {
      //     defaultValues.push({ text: this._DEVICE_LABEL_LEFT, value: this._DEVICE_LABEL_LEFT })
      //   }
      //   if (this._supportedFacingModes.includes("right")) {
      //     defaultValues.push({ text: this._DEVICE_LABEL_RIGHT, value: this._DEVICE_LABEL_RIGHT })
      //   }
      // }
      var deviceValues = this._videoDevices.map(function (dev) {
        var value = dev.label.match(/[0-9a-f:\.-]{8}/i) ? dev.label : dev.label + "\u200B [" + dev.deviceId.substring(0, 8) + ']';
        return {
          text: value,
          value: value
        };
      }).sort(function (a, b) {
        return b.text < a.text;
      });
      return defaultValues.concat(deviceValues);
    }

    /**
     * @private
     * @param {MediaTrackConstraints | {label?: string}} videoTrackConstraints
     * @returns {MediaDeviceInfo}
     */
  }, {
    key: "_findVideoDevice",
    value: function _findVideoDevice(videoTrackConstraints) {
      if (typeof videoTrackConstraints.deviceId !== "undefined" && videoTrackConstraints.deviceId !== "") {
        return this._videoDevices.find(function (dev) {
          return dev.deviceId === videoTrackConstraints.deviceId;
        });
      }
      // label指定の場合は完全一致と先頭一致と部分一致をチェックする
      if (typeof videoTrackConstraints.label !== "undefined" && videoTrackConstraints.label !== "") {
        var _videoTrackConstraint = videoTrackConstraints.label.split("\u200B [", 2),
          _videoTrackConstraint2 = _slicedToArray(_videoTrackConstraint, 2),
          label = _videoTrackConstraint2[0],
          suffix = _videoTrackConstraint2[1];
        var deviceIdPrefix = (suffix || '').replace(/[^0-9a-f].*/i, '');
        var dev = this._videoDevices.find(function (dev) {
          return dev.label === label && deviceIdPrefix && dev.deviceId.startsWith(deviceIdPrefix);
        }) || this._videoDevices.find(function (dev) {
          return dev.label === label;
        }) || this._videoDevices.find(function (dev) {
          return dev.label.startsWith(label);
        }) || this._videoDevices.find(function (dev) {
          return dev.label.includes(label);
        }) || this._videoDevices.find(function (dev) {
          return dev.label.toLocaleLowerCase().includes(label);
        });
        if (dev != null) {
          return dev;
        }
      }
      return null;
    }

    /**
     * @private
     */
  }, {
    key: "_registerListeners",
    value: function _registerListeners() {
      var _this = this;
      // mediaDevices の変化の監視
      navigator.permissions.query({
        name: "camera"
      }).then(function (p) {
        return p.addEventListener('change', function () {
          return _this._onChangeMediaDevice();
        });
      });
      navigator.mediaDevices.addEventListener("devicechange", function () {
        return _this._onChangeMediaDevice();
      });
      this._onChangeMediaDevice();
      // VideoProvider の video プロパティの監視
      /** @private @type {HTMLVideoElement | null} */
      this._oldVideo = null;
      /** @private @type {NodeJS.Timeout} */
      this._videoChangeWatchdogTimeout = setInterval(function () {
        return _this._videoChangeWatchdog();
      }, 200);
    }

    /**
     * Updates the list of available video devices.
     * @private
     */
  }, {
    key: "_onChangeMediaDevice",
    value: function _onChangeMediaDevice() {
      var _this2 = this;
      navigator.mediaDevices.enumerateDevices().catch(function () {
        return [];
      }).then(function (devices) {
        _this2._videoDevices = devices.filter(function (d) {
          return d.kind === 'videoinput';
        }).filter(function (d) {
          return d.deviceId;
        });
      }).then(function () {
        // 指定デバイスが見つかったならカメラを切り替える
        var dev = _this2._findVideoDevice(_this2._desiredVideoTrackConstraints);
        if (dev != null && dev.deviceId) {
          _this2._desiredVideoTrackConstraints = {
            deviceId: dev.deviceId
          };
          _this2._openVideoStream(_this2._video);
        }
      });
    }

    /**
     * runtime.ioDevices.video.provider の _video の変化を監視する
     * @private
     */
  }, {
    key: "_videoChangeWatchdog",
    value: function _videoChangeWatchdog() {
      var oldVideo = this._oldVideo; // instance value
      var newVideo = this._video; // getter
      if (oldVideo !== newVideo) {
        this._oldVideo = newVideo;
        this._onChangeVideoElement(oldVideo, newVideo);
      }
    }

    /**
     * video エレメントに変化があった際にカメラ選択機能を追従させる
     * @param {HTMLVideoElement | null} oldVideo
     * @param {HTMLVideoElement | null} newVideo
     */
  }, {
    key: "_onChangeVideoElement",
    value: function _onChangeVideoElement(oldVideo, newVideo) {
      if (oldVideo != null) {
        this._closeVideoStream(oldVideo);
      }
      if (newVideo != null) {
        this._openVideoStream(newVideo);
      }
    }

    /**
     * @private
     * @param {HTMLVideoElement} video
     */
  }, {
    key: "_closeVideoStream",
    value: function _closeVideoStream(video) {
      if (video) {
        if (video.srcObject) {
          video.srcObject.getTracks().forEach(function (track) {
            return track.stop();
          });
        }
        video.src = '';
      }
    }

    /**
     *
     * @private
     * @param {HTMLVideoElement} video
     * @returns {Promise<MediaStream | null>}
     */
  }, {
    key: "_openVideoStream",
    value: function _openVideoStream(video) {
      var _this3 = this;
      if (video == null) {
        return Promise.resolve(null);
      }
      var dev = this._findVideoDevice(this._desiredVideoTrackConstraints);
      if (dev && dev.deviceId) {
        if (dev.deviceId === this._deviceId) {
          // 現在使用中のビデオデバイスIDと同じなので何もしない
          return Promise.resolve(video.srcObject);
        }
        // デバイスIDがあるなら他の条件は不要
        this._desiredVideoTrackConstraints = {
          deviceId: dev.deviceId
        };
      }
      // 新しい stream を取得する前に既存の stream があれば閉じておく
      this._closeVideoStream(video);
      // video エレメントではなく VideoProvider._track が存在する場合はそれも閉じておく（vide.srcObject と一致しない場合がある）
      if (this._videoProvider && this._videoProvider._track) {
        this._videoProvider._track.stop();
      }
      return getUserMedia({
        audio: false,
        video: Object.assign({
          width: {
            min: 480,
            ideal: 640
          },
          height: {
            min: 360,
            ideal: 480
          }
        }, this._desiredVideoTrackConstraints)
      }).then( /*#__PURE__*/function () {
        var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(stream) {
          return regenerator.wrap(function _callee$(_context) {
            while (1) switch (_context.prev = _context.next) {
              case 0:
                try {
                  video.srcObject = stream;
                } catch (error) {
                  video.src = window.URL.createObjectURL(stream);
                }
                // Needed for Safari/Firefox, Chrome auto-plays.
                _context.next = 3;
                return video.play();
              case 3:
                // runtime の VideoProvide が保持する track も差し替える
                _this3._videoProvider._track = stream.getTracks()[0];
                return _context.abrupt("return", stream);
              case 5:
              case "end":
                return _context.stop();
            }
          }, _callee);
        }));
        return function (_x) {
          return _ref.apply(this, arguments);
        };
      }());
    }

    /** @returns {string[]} */
  }, {
    key: "_supportedFacingModes",
    get: function get() {
      var _ref2;
      return Array.from(new Set((_ref2 = []).concat.apply(_ref2, _toConsumableArray(this._videoDevices.map(function (dev) {
        return dev.getCapabilities().facingMode || [];
      })))));
    }

    /** @returns {VideoProvider | null} See https://github.com/scratchfoundation/scratch-gui/blob/develop/src/lib/video/video-provider.js */
  }, {
    key: "_videoProvider",
    get: function get() {
      return this.runtime.ioDevices.video.provider || null;
    }

    /** @return {Omit<HTMLVideoElement, keyof HTMLElement> | null} VideoProvider に紐づいた video エレメント */
  }, {
    key: "_video",
    get: function get() {
      return this._videoProvider && this._videoProvider.video;
    }

    /** @returns {MediaStreamTrack[]} 現在使用中のビデオトラック */
  }, {
    key: "_tracks",
    get: function get() {
      return this._video && this._video.srcObject && this._video.srcObject.getTracks() || [];
    }

    /** @returns {string | undefined} 現在使用中のビデオデバイスID */
  }, {
    key: "_deviceId",
    get: function get() {
      return (this._tracks[0] && this._tracks[0].getCapabilities() || {}).deviceId;
    }

    /** @returns {InputDeviceInfo | undefined} 現在使用中のビデオデバイス */
  }, {
    key: "_device",
    get: function get() {
      var _this4 = this;
      return this._videoDevices.find(function (dev) {
        return dev.deviceId === _this4._deviceId;
      });
    }

    /** @returns {string} デフォルトカメラを指すラベル */
  }, {
    key: "_DEVICE_LABEL_DEFAULT",
    get: function get() {
      return wrapZWSP(formatMessage({
        id: 'cameraselector.deviceLabelDefault',
        default: translations.en['cameraselector.deviceLabelDefault']
      }));
    }

    /** @returns {string} 前面カメラを指すラベル */
  }, {
    key: "_DEVICE_LABEL_USER",
    get: function get() {
      return wrapZWSP(formatMessage({
        id: 'cameraselector.deviceLabelUser',
        default: translations.en['cameraselector.deviceLabelUser']
      }));
    }

    /** @returns {string} 背面カメラを指すラベル */
  }, {
    key: "_DEVICE_LABEL_ENVIRONMENT",
    get: function get() {
      return wrapZWSP(formatMessage({
        id: 'cameraselector.deviceLabelEnvironment',
        default: translations.en['cameraselector.deviceLabelEnvironment']
      }));
    }

    /** @returns {string} 左カメラを指すラベル */
  }, {
    key: "_DEVICE_LABEL_LEFT",
    get: function get() {
      return wrapZWSP(formatMessage({
        id: 'cameraselector.deviceLabelLeft',
        default: translations.en['cameraselector.deviceLabelLeft']
      }));
    }

    /** @returns {string} 右カメラを指すラベル */
  }, {
    key: "_DEVICE_LABEL_RIGHT",
    get: function get() {
      return wrapZWSP(formatMessage({
        id: 'cameraselector.deviceLabelRight',
        default: translations.en['cameraselector.deviceLabelRight']
      }));
    }
  }, {
    key: "_STANDARD_DEVICE_LABELS",
    get: function get() {
      var locales = Object.keys(translations);
      return ['Default', 'User', 'Environment', 'Left', 'Right'].map(function (suffix) {
        return [suffix, locales.map(function (locale) {
          return translations[locale]['cameraselector.deviceLabel' + suffix];
        }).map(wrapZWSP)];
      }).reduce(function (o, _ref3) {
        var _ref4 = _slicedToArray(_ref3, 2),
          k = _ref4[0],
          labels = _ref4[1];
        return Object.assign(o, _defineProperty({}, k.toLowerCase(), labels));
      }, {});
    }
  }], [{
    key: "formatMessage",
    set:
    /**
      * A translation object which is used in this class.
      * @param {FormatObject} formatter - translation object
      */
    function set(formatter) {
      formatMessage = formatter;
      if (formatMessage) setupTranslations();
    }

    /**
     * @return {string} - the name of this extension.
     */
  }, {
    key: "EXTENSION_NAME",
    get: function get() {
      return formatMessage({
        id: 'cameraselector.name',
        default: translations.en['cameraselector.name'],
        description: 'name of the extension'
      });
    }

    /**
     * @return {string} - the ID of this extension.
     */
  }, {
    key: "EXTENSION_ID",
    get: function get() {
      return EXTENSION_ID;
    }

    /**
     * URL to get this extension.
     * @type {string}
     */
  }, {
    key: "extensionURL",
    get: function get() {
      return extensionURL;
    }

    /**
     * Set URL to get this extension.
     * The extensionURL will be changed to the URL of the loading server.
     * @param {string} url - URL
     */,
    set: function set(url) {
      extensionURL = url;
    }
  }]);
  return ExtensionBlocks;
}();
/**
 * 取得されたビデオデバイス一覧の label にマッチしないように ZWSP で囲む
 * @param {string} s
 * @returns {string}
 */
var wrapZWSP = function wrapZWSP(s) {
  return "\u200B" + s + "\u200B";
};

/**
 * 同時実行を抑制した getUserMedia
 * @param {MediaStreamConstraints} constraints
 * @returns {Promise<MediaStream>}
 */
var getUserMedia = singleExecute(function (constraints) {
  return navigator.mediaDevices.getUserMedia(constraints);
}, true);

/**
 * Takes a function (asynchronous or synchronous) and returns a wrapper function that ensures
 * the function is not executed concurrently. If the function is called again while it is already
 * executing, the behavior can be controlled with the queueLastCall option: if true, the
 * function will be re-executed with the last arguments after the current execution completes;
 * if false, the last call will be ignored.
 *
 * @template T The argument types of the function as a tuple.
 * @template R The return type of the function.
 * @param {(...args: T) => R | Promise<R>} func - The function (asynchronous or synchronous) to wrap.
 * @param {boolean} [queueLastCall=false] - Whether to re-execute the function with the last arguments after the current execution.
 * @returns {(...args: T) => Promise<R>} A wrapper function that manages execution.
 */
function singleExecute(func) {
  var queueLastCall = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  var processing = false;
  var lastArgs = null;
  var pendingPromise = null;
  var asyncedFunc = /*#__PURE__*/function () {
    var _ref5 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
      var _args2 = arguments;
      return regenerator.wrap(function _callee2$(_context2) {
        while (1) switch (_context2.prev = _context2.next) {
          case 0:
            return _context2.abrupt("return", func.apply(void 0, _args2));
          case 1:
          case "end":
            return _context2.stop();
        }
      }, _callee2);
    }));
    return function asyncedFunc() {
      return _ref5.apply(this, arguments);
    };
  }();
  var singleExecutedFunc = /*#__PURE__*/function () {
    var _ref6 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
      var _len,
        args,
        _key,
        _args3 = arguments;
      return regenerator.wrap(function _callee3$(_context3) {
        while (1) switch (_context3.prev = _context3.next) {
          case 0:
            for (_len = _args3.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
              args[_key] = _args3[_key];
            }
            if (!processing) {
              _context3.next = 4;
              break;
            }
            if (queueLastCall) {
              lastArgs = args;
            }
            return _context3.abrupt("return", pendingPromise);
          case 4:
            processing = true;
            pendingPromise = asyncedFunc.apply(void 0, args).finally(function () {
              processing = false;
              if (queueLastCall && lastArgs !== null) {
                var nextArgs = lastArgs;
                lastArgs = null;
                return singleExecutedFunc.apply(void 0, _toConsumableArray(nextArgs));
              }
            });
            return _context3.abrupt("return", pendingPromise);
          case 7:
          case "end":
            return _context3.stop();
        }
      }, _callee3);
    }));
    return function singleExecutedFunc() {
      return _ref6.apply(this, arguments);
    };
  }();
  return singleExecutedFunc;
}

export { ExtensionBlocks as blockClass, entry };
