Code coverage report for dnd-core/modules/utils/HandlerRegistry.js

Statements: 93.02% (120 / 129)      Branches: 67.86% (19 / 28)      Functions: 100% (26 / 26)      Lines: 100% (116 / 116)      Ignored: none     

All files » dnd-core/modules/utils/ » HandlerRegistry.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208    4   809   50   1   1   1   1   1         1 1   1 811   809   809 809 809   809 43   809     1 130 130 130   130 6   130     1 55 55 55     1 75     1 347   346   346     1 340   339   339     1 157 9 17   6     148     1 1 50   50   50 50 50     1 59 55   55 53   53 53     1 81 75   75 72   72 72     1 130 130   130 125   125     1 130   130 169       1 217   213 213   213     1 203 199     1 69   69   69   69     1 55   55   55   55     1 8 7   6 6     1 10 9   7 7     1 45 45   45 45     1 24   24 24     1     1  
"use strict";
 
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
 
var _slicedToArray = function (arr, i) { Eif (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { var _arr = []; for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { _arr.push(_step.value); if (i && _arr.length === i) break; } return _arr; } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } };
 
var _classCallCheck = function (instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
 
var invariant = _interopRequire(require("invariant"));
 
var keyMirror = _interopRequire(require("keymirror"));
 
var isArray = _interopRequire(require("lodash/lang/isArray"));
 
var getNextUniqueId = _interopRequire(require("./getNextUniqueId"));
 
var HandlerRoles = keyMirror({
  SOURCE: null,
  TARGET: null
});
 
var HANDLE_SEPARATOR = "🐲";
var TYPE_SEPARATOR = "💧";
 
function parseHandle(handle) {
  var _handle$split = handle.split(HANDLE_SEPARATOR);
 
  var _handle$split2 = _slicedToArray(_handle$split, 3);
 
  var type = _handle$split2[0];
  var role = _handle$split2[1];
  var id = _handle$split2[2];
 
  if (type.indexOf(TYPE_SEPARATOR) > -1) {
    type = type.split(TYPE_SEPARATOR);
  }
  return { type: type, role: role, id: id };
}
 
function makeHandle(_ref) {
  var type = _ref.type;
  var role = _ref.role;
  var id = _ref.id;
 
  if (isArray(type)) {
    type = type.join(TYPE_SEPARATOR);
  }
  return [type, role, id].join(HANDLE_SEPARATOR);
}
 
function validateSourceContract(source) {
  invariant(typeof source.canDrag === "function", "Expected canDrag to be a function.");
  invariant(typeof source.beginDrag === "function", "Expected beginDrag to be a function.");
  invariant(typeof source.endDrag === "function", "Expected endDrag to be a function.");
}
 
function validateTargetContract(target) {
  invariant(typeof target.drop === "function", "Expected beginDrag to be a function.");
}
 
function validateSourceHandle(handle) {
  var _parseHandle = parseHandle(handle);
 
  var role = _parseHandle.role;
 
  invariant(role === HandlerRoles.SOURCE, "Expected to receive a source handle");
}
 
function validateTargetHandle(handle) {
  var _parseHandle = parseHandle(handle);
 
  var role = _parseHandle.role;
 
  invariant(role === HandlerRoles.TARGET, "Expected to receive a target handle");
}
 
function validateType(type, allowArray) {
  if (allowArray && isArray(type)) {
    type.forEach(function (t) {
      return validateType(t, false);
    });
    return;
  }
 
  invariant(typeof type === "string", allowArray ? "Type can only be a string or an array of them." : "Type can only be a string.");
}
 
var HandlerRegistry = (function () {
  function HandlerRegistry(actions) {
    _classCallCheck(this, HandlerRegistry);
 
    this.actions = actions;
 
    this.handlers = {};
    this.pinnedSourceHandle = null;
    this.pinnedSource = null;
  }
 
  HandlerRegistry.prototype.addSource = function addSource(type, source) {
    validateType(type);
    validateSourceContract(source);
 
    var sourceHandle = this.addHandler(HandlerRoles.SOURCE, type, source);
    validateSourceHandle(sourceHandle);
 
    this.actions.addSource(sourceHandle);
    return sourceHandle;
  };
 
  HandlerRegistry.prototype.addTarget = function addTarget(type, target) {
    validateType(type, true);
    validateTargetContract(target);
 
    var targetHandle = this.addHandler(HandlerRoles.TARGET, type, target);
    validateTargetHandle(targetHandle);
 
    this.actions.addTarget(targetHandle);
    return targetHandle;
  };
 
  HandlerRegistry.prototype.addHandler = function addHandler(role, type, handler) {
    var id = getNextUniqueId().toString();
    var handle = makeHandle({ role: role, type: type, id: id });
 
    invariant(!this.containsHandler(handler), "Cannot add the same handler instance twice.");
    this.handlers[handle] = handler;
 
    return handle;
  };
 
  HandlerRegistry.prototype.containsHandler = function containsHandler(handler) {
    var _this = this;
 
    return Object.keys(this.handlers).some(function (key) {
      return _this.handlers[key] === handler;
    });
  };
 
  HandlerRegistry.prototype.getSource = function getSource(sourceHandle, includePinned) {
    validateSourceHandle(sourceHandle);
 
    var isPinned = includePinned && sourceHandle === this.pinnedSourceHandle;
    var source = isPinned ? this.pinnedSource : this.handlers[sourceHandle];
 
    return source;
  };
 
  HandlerRegistry.prototype.getTarget = function getTarget(targetHandle) {
    validateTargetHandle(targetHandle);
    return this.handlers[targetHandle];
  };
 
  HandlerRegistry.prototype.getSourceType = function getSourceType(sourceHandle) {
    validateSourceHandle(sourceHandle);
 
    var _parseHandle = parseHandle(sourceHandle);
 
    var type = _parseHandle.type;
 
    return type;
  };
 
  HandlerRegistry.prototype.getTargetType = function getTargetType(targetHandle) {
    validateTargetHandle(targetHandle);
 
    var _parseHandle = parseHandle(targetHandle);
 
    var type = _parseHandle.type;
 
    return type;
  };
 
  HandlerRegistry.prototype.removeSource = function removeSource(sourceHandle) {
    validateSourceHandle(sourceHandle);
    invariant(this.getSource(sourceHandle), "Cannot remove a source that was not added.");
 
    delete this.handlers[sourceHandle];
    this.actions.removeSource(sourceHandle);
  };
 
  HandlerRegistry.prototype.removeTarget = function removeTarget(targetHandle) {
    validateTargetHandle(targetHandle);
    invariant(this.getTarget(targetHandle), "Cannot remove a target that was not added.");
 
    delete this.handlers[targetHandle];
    this.actions.removeTarget(targetHandle);
  };
 
  HandlerRegistry.prototype.pinSource = function pinSource(handle) {
    var source = this.getSource(handle);
    invariant(source, "Cannot pin a source that was not added.");
 
    this.pinnedSourceHandle = handle;
    this.pinnedSource = source;
  };
 
  HandlerRegistry.prototype.unpinSource = function unpinSource() {
    invariant(this.pinnedSource, "No source is pinned at the time.");
 
    this.pinnedSourceHandle = null;
    this.pinnedSource = null;
  };
 
  return HandlerRegistry;
})();
 
module.exports = HandlerRegistry;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9kYW4vRG9jdW1lbnRzL1Byb2plY3RzL2RuZC1jb3JlL21vZHVsZXMvdXRpbHMvSGFuZGxlclJlZ2lzdHJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0lBQU8sU0FBUywyQkFBTSxXQUFXOztJQUMxQixTQUFTLDJCQUFNLFdBQVc7O0lBQzFCLE9BQU8sMkJBQU0scUJBQXFCOztJQUNsQyxlQUFlLDJCQUFNLG1CQUFtQjs7QUFFL0MsSUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBQzdCLFFBQU0sRUFBRSxJQUFJO0FBQ1osUUFBTSxFQUFFLElBQUk7Q0FDYixDQUFDLENBQUM7O0FBRUgsSUFBTSxnQkFBZ0IsR0FBRyxJQUFjLENBQUM7QUFDeEMsSUFBTSxjQUFjLEdBQUcsSUFBYyxDQUFDOztBQUV0QyxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7c0JBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQzs7OztNQUFoRCxJQUFJO01BQUUsSUFBSTtNQUFFLEVBQUU7O0FBQ25CLE1BQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNyQyxRQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztHQUNuQztBQUNELFNBQU8sRUFBRSxJQUFJLEVBQUosSUFBSSxFQUFFLElBQUksRUFBSixJQUFJLEVBQUUsRUFBRSxFQUFGLEVBQUUsRUFBRSxDQUFDO0NBQzNCOztBQUVELFNBQVMsVUFBVSxPQUFxQjtNQUFsQixJQUFJLFFBQUosSUFBSTtNQUFFLElBQUksUUFBSixJQUFJO01BQUUsRUFBRSxRQUFGLEVBQUU7O0FBQ2xDLE1BQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2pCLFFBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0dBQ2xDO0FBQ0QsU0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFB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QUMsQ0FBQztHQUN6Qzs7QUFyRmtCLGlCQUFlLFdBdUZsQyxTQUFTLEdBQUEsbUJBQUMsTUFBTSxFQUFFO0FBQ2hCLFFBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsYUFBUyxDQUFDLE1BQU0sRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDOztBQUU3RCxRQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLFFBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0dBQzVCOztBQTdGa0IsaUJBQWUsV0ErRmxDLFdBQVcsR0FBQSx1QkFBRztBQUNaLGFBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7O0FBRWpFLFFBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDL0IsUUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7R0FDMUI7O1NBcEdrQixlQUFlOzs7aUJBQWYsZUFBZSIsImZpbGUiOiIvVXNlcnMvZGFuL0RvY3VtZW50cy9Qcm9qZWN0cy9kbmQtY29yZS9tb2R1bGVzL3V0aWxzL0hhbmRsZXJSZWdpc3RyeS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCBrZXlNaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCBpc0FycmF5IGZyb20gJ2xvZGFzaC9sYW5nL2lzQXJyYXknO1xuaW1wb3J0IGdldE5leHRVbmlxdWVJZCBmcm9tICcuL2dldE5leHRVbmlxdWVJZCc7XG5cbmNvbnN0IEhhbmRsZXJSb2xlcyA9IGtleU1pcnJvcih7XG4gIFNPVVJDRTogbnVsbCxcbiAgVEFSR0VUOiBudWxsXG59KTtcblxuY29uc3QgSEFORExFX1NFUEFSQVRPUiA9ICdcXHVkODNkXFx1ZGMzMic7XG5jb25zdCBUWVBFX1NFUEFSQVRPUiA9ICdcXHVkODNkXFx1ZGNhNyc7XG5cbmZ1bmN0aW9uIHBhcnNlSGFuZGxlKGhhbmRsZSkge1xuICBsZXQgW3R5cGUsIHJvbGUsIGlkXSA9IGhhbmRsZS5zcGxpdChIQU5ETEVfU0VQQVJBVE9SKTtcbiAgaWYgKHR5cGUuaW5kZXhPZihUWVBFX1NFUEFSQVRPUikgPiAtMSkge1xuICAgIHR5cGUgPSB0eXBlLnNwbGl0KFRZUEVfU0VQQVJBVE9SKTtcbiAgfVxuICByZXR1cm4geyB0eXBlLCByb2xlLCBpZCB9O1xufVxuXG5mdW5jdGlvbiBtYWtlSGFuZGxlKHsgdHlwZSwgcm9sZSwgaWQgfSkge1xuICBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgIHR5cGUgPSB0eXBlLmpvaW4oVFlQRV9TRVBBUkFUT1IpO1xuICB9XG4gIHJldHVybiBbdHlwZSwgcm9sZSwgaWRdLmpvaW4oSEFORExFX1NFUEFSQVRPUik7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU291cmNlQ29udHJhY3Qoc291cmNlKSB7XG4gIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmNhbkRyYWcgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBjYW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmJlZ2luRHJhZyA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGJlZ2luRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICBpbnZhcmlhbnQodHlwZW9mIHNvdXJjZS5lbmREcmFnID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgZW5kRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhcmdldENvbnRyYWN0KHRhcmdldCkge1xuICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5kcm9wID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgYmVnaW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU291cmNlSGFuZGxlKGhhbmRsZSkge1xuICBjb25zdCB7IHJvbGUgfSA9IHBhcnNlSGFuZGxlKGhhbmRsZSk7XG4gIGludmFyaWFudChyb2xlID09PSBIYW5kbGVyUm9sZXMuU09VUkNFLCAnRXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNvdXJjZSBoYW5kbGUnKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRIYW5kbGUoaGFuZGxlKSB7XG4gIGNvbnN0IHsgcm9sZSB9ID0gcGFyc2VIYW5kbGUoaGFuZGxlKTtcbiAgaW52YXJpYW50KHJvbGUgPT09IEhhbmRsZXJSb2xlcy5UQVJHRVQsICdFeHBlY3RlZCB0byByZWNlaXZlIGEgdGFyZ2V0IGhhbmRsZScpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGUodHlwZSwgYWxsb3dBcnJheSkge1xuICBpZiAoYWxsb3dBcnJheSAmJiBpc0FycmF5KHR5cGUpKSB7XG4gICAgdHlwZS5mb3JFYWNoKHQgPT4gdmFsaWRhdGVUeXBlKHQsIGZhbHNlKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW52YXJpYW50KFxuICAgIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyxcbiAgICBhbGxvd0FycmF5ID9cbiAgICAgICdUeXBlIGNhbiBvbmx5IGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHRoZW0uJyA6XG4gICAgICAnVHlwZSBjYW4gb25seSBiZSBhIHN0cmluZy4nXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhbmRsZXJSZWdpc3RyeSB7XG4gIGNvbnN0cnVjdG9yKGFjdGlvbnMpIHtcbiAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zO1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMucGlubmVkU291cmNlSGFuZGxlID0gbnVsbDtcbiAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IG51bGw7XG4gIH1cblxuICBhZGRTb3VyY2UodHlwZSwgc291cmNlKSB7XG4gICAgdmFsaWRhdGVUeXBlKHR5cGUpO1xuICAgIHZhbGlkYXRlU291cmNlQ29udHJhY3Qoc291cmNlKTtcblxuICAgIGNvbnN0IHNvdXJjZUhhbmRsZSA9IHRoaXMuYWRkSGFuZGxlcihIYW5kbGVyUm9sZXMuU09VUkNFLCB0eXBlLCBzb3VyY2UpO1xuICAgIHZhbGlkYXRlU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSk7XG5cbiAgICB0aGlzLmFjdGlvbnMuYWRkU291cmNlKHNvdXJjZUhhbmRsZSk7XG4gICAgcmV0dXJuIHNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIGFkZFRhcmdldCh0eXBlLCB0YXJnZXQpIHtcbiAgICB2YWxpZGF0ZVR5cGUodHlwZSwgdHJ1ZSk7XG4gICAgdmFsaWRhdGVUYXJnZXRDb250cmFjdCh0YXJnZXQpO1xuXG4gICAgY29uc3QgdGFyZ2V0SGFuZGxlID0gdGhpcy5hZGRIYW5kbGVyKEhhbmRsZXJSb2xlcy5UQVJHRVQsIHR5cGUsIHRhcmdldCk7XG4gICAgdmFsaWRhdGVUYXJnZXRIYW5kbGUodGFyZ2V0SGFuZGxlKTtcblxuICAgIHRoaXMuYWN0aW9ucy5hZGRUYXJnZXQodGFyZ2V0SGFuZGxlKTtcbiAgICByZXR1cm4gdGFyZ2V0SGFuZGxlO1xuICB9XG5cbiAgYWRkSGFuZGxlcihyb2xlLCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgaWQgPSBnZXROZXh0VW5pcXVlSWQoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGhhbmRsZSA9IG1ha2VIYW5kbGUoeyByb2xlLCB0eXBlLCBpZCB9KTtcblxuICAgIGludmFyaWFudCghdGhpcy5jb250YWluc0hhbmRsZXIoaGFuZGxlciksICdDYW5ub3QgYWRkIHRoZSBzYW1lIGhhbmRsZXIgaW5zdGFuY2UgdHdpY2UuJyk7XG4gICAgdGhpcy5oYW5kbGVyc1toYW5kbGVdID0gaGFuZGxlcjtcblxuICAgIHJldHVybiBoYW5kbGU7XG4gIH1cblxuICBjb250YWluc0hhbmRsZXIoaGFuZGxlcikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmhhbmRsZXJzKS5zb21lKGtleSA9PiB0aGlzLmhhbmRsZXJzW2tleV0gPT09IGhhbmRsZXIpO1xuICB9XG5cbiAgZ2V0U291cmNlKHNvdXJjZUhhbmRsZSwgaW5jbHVkZVBpbm5lZCkge1xuICAgIHZhbGlkYXRlU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSk7XG5cbiAgICBjb25zdCBpc1Bpbm5lZCA9IGluY2x1ZGVQaW5uZWQgJiYgc291cmNlSGFuZGxlID09PSB0aGlzLnBpbm5lZFNvdXJjZUhhbmRsZTtcbiAgICBjb25zdCBzb3VyY2UgPSBpc1Bpbm5lZCA/IHRoaXMucGlubmVkU291cmNlIDogdGhpcy5oYW5kbGVyc1tzb3VyY2VIYW5kbGVdO1xuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGdldFRhcmdldCh0YXJnZXRIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVRhcmdldEhhbmRsZSh0YXJnZXRIYW5kbGUpO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzW3RhcmdldEhhbmRsZV07XG4gIH1cblxuICBnZXRTb3VyY2VUeXBlKHNvdXJjZUhhbmRsZSkge1xuICAgIHZhbGlkYXRlU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSk7XG4gICAgY29uc3QgeyB0eXBlIH0gPSBwYXJzZUhhbmRsZShzb3VyY2VIYW5kbGUpO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZ2V0VGFyZ2V0VHlwZSh0YXJnZXRIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVRhcmdldEhhbmRsZSh0YXJnZXRIYW5kbGUpO1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gcGFyc2VIYW5kbGUodGFyZ2V0SGFuZGxlKTtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHJlbW92ZVNvdXJjZShzb3VyY2VIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVNvdXJjZUhhbmRsZShzb3VyY2VIYW5kbGUpO1xuICAgIGludmFyaWFudCh0aGlzLmdldFNvdXJjZShzb3VyY2VIYW5kbGUpLCAnQ2Fubm90IHJlbW92ZSBhIHNvdXJjZSB0aGF0IHdhcyBub3QgYWRkZWQuJyk7XG5cbiAgICBkZWxldGUgdGhpcy5oYW5kbGVyc1tzb3VyY2VIYW5kbGVdO1xuICAgIHRoaXMuYWN0aW9ucy5yZW1vdmVTb3VyY2Uoc291cmNlSGFuZGxlKTtcbiAgfVxuXG4gIHJlbW92ZVRhcmdldCh0YXJnZXRIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVRhcmdldEhhbmRsZSh0YXJnZXRIYW5kbGUpO1xuICAgIGludmFyaWFudCh0aGlzLmdldFRhcmdldCh0YXJnZXRIYW5kbGUpLCAnQ2Fubm90IHJlbW92ZSBhIHRhcmdldCB0aGF0IHdhcyBub3QgYWRkZWQuJyk7XG5cbiAgICBkZWxldGUgdGhpcy5oYW5kbGVyc1t0YXJnZXRIYW5kbGVdO1xuICAgIHRoaXMuYWN0aW9ucy5yZW1vdmVUYXJnZXQodGFyZ2V0SGFuZGxlKTtcbiAgfVxuXG4gIHBpblNvdXJjZShoYW5kbGUpIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShoYW5kbGUpO1xuICAgIGludmFyaWFudChzb3VyY2UsICdDYW5ub3QgcGluIGEgc291cmNlIHRoYXQgd2FzIG5vdCBhZGRlZC4nKTtcblxuICAgIHRoaXMucGlubmVkU291cmNlSGFuZGxlID0gaGFuZGxlO1xuICAgIHRoaXMucGlubmVkU291cmNlID0gc291cmNlO1xuICB9XG5cbiAgdW5waW5Tb3VyY2UoKSB7XG4gICAgaW52YXJpYW50KHRoaXMucGlubmVkU291cmNlLCAnTm8gc291cmNlIGlzIHBpbm5lZCBhdCB0aGUgdGltZS4nKTtcblxuICAgIHRoaXMucGlubmVkU291cmNlSGFuZGxlID0gbnVsbDtcbiAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IG51bGw7XG4gIH1cbn0iXX0=