adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
289 lines (256 loc) • 37.3 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; return _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; }, _typeof(obj); }
var _react = _interopRequireWildcard(require("react"));
var _enzyme = require("enzyme");
var _reactTestRenderer = _interopRequireDefault(require("react-test-renderer"));
var _ = _interopRequireDefault(require(".."));
var _core = require("../core");
var _testUtils = require("react-dom/test-utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
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, 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; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
var RangePicker = _["default"].RangePicker;
var RangePickerMounter = function (_Component) {
_inherits(RangePickerMounter, _Component);
var _super = _createSuper(RangePickerMounter);
function RangePickerMounter() {
var _this;
_classCallCheck(this, RangePickerMounter);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this.state = {
component: null,
value: [new Date(), new Date()],
visible: true
};
return _this;
}
_createClass(RangePickerMounter, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$state = this.state,
value = _this$state.value,
visible = _this$state.visible;
return _react["default"].createElement(RangePicker, _extends({
shortcuts: [{
label: "祖国生日",
value: [new Date("2020-10-01"), new Date("2020-10-07")]
}],
ref: function ref(component) {
if (!_this2.state.component) {
_this2.setState({
component: component
});
}
},
closeOnSelect: true,
value: value,
visible: visible,
onChange: function onChange(val) {
return _this2.setState({
value: val
});
},
onVisibleChange: function onVisibleChange(bool) {
return _this2.setState({
visible: bool
});
}
}, this.props));
}
}]);
return RangePickerMounter;
}(_react.Component);
describe("RangePicker", function () {
beforeAll(function () {
jest.useFakeTimers();
});
afterAll(function () {
jest.useRealTimers();
});
it("是否正确渲染", function () {
var wrapper = _reactTestRenderer["default"].create(_react["default"].createElement(RangePicker, null));
expect(wrapper).toMatchSnapshot();
});
it("内部驱动", function () {
var val = [new Date("2020-02-02"), new Date("2020-03-01")];
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePicker, {
defaultValue: val,
defaultVisible: false,
closeOnSelect: true
}));
expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val));
wrapper.find("input").simulate("focus");
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
wrapper.find("input").simulate("change", {
target: {
value: ""
}
});
expect(wrapper.find("input").props().value).toBe("");
wrapper.find("input").simulate("change", {
target: {
value: "2020-02-22 - 2020-02-28"
}
});
expect(wrapper.find("input").props().value).toBe("2020-02-22 - 2020-02-28");
(0, _testUtils.act)(function () {
wrapper.find("input").simulate("keydown", {
key: "enter",
keyCode: 13
});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find("Popover").at(0).props().visible).toBe(false);
});
(0, _testUtils.act)(function () {
wrapper.find(".adui-date-day").at(14).simulate("click");
wrapper.find(".adui-date-day").at(15).simulate("click");
var expectedVal = (0, _core.convertDateRangeToString)([new Date(wrapper.find(".adui-date-day").at(14).props()["aria-label"] + " 12:00"), new Date(wrapper.find(".adui-date-day").at(15).props()["aria-label"] + " 12:00")]);
jest.advanceTimersByTime(350);
wrapper.update();
expect(wrapper.find("Popover").at(0).props().visible).toBe(false);
});
});
it("外部控制", function () {
var val = [new Date(), new Date()];
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePicker, {
value: [new Date(), new Date()],
visible: true,
closeOnSelect: true
}));
expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val));
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
(0, _testUtils.act)(function () {
wrapper.find(".adui-date-day").at(14).simulate("click");
wrapper.find(".adui-date-day").at(15).simulate("click");
jest.advanceTimersByTime(350);
wrapper.update();
expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val));
});
(0, _testUtils.act)(function () {
wrapper.find(".adui-date-day").at(15).simulate("click");
wrapper.find(".adui-date-day").at(16).simulate("click");
jest.advanceTimersByTime(350);
wrapper.update();
expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val));
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
});
var mounter = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, null));
var today = (0, _core.convertDateRangeToString)(new Date());
mounter.find("input").simulate("change", {
target: {
value: "2020-02-22 - 2020-02-26"
}
});
expect((0, _core.convertDateRangeToString)(mounter.state().value)).toBe("2020-02-22 - 2020-02-26");
mounter.find("input").simulate("change", {
target: {
value: "2020-02-25 - 2020-02-26"
}
});
expect((0, _core.convertDateRangeToString)(mounter.state().value)).toBe("2020-02-25 - 2020-02-26");
mounter.find("input").simulate("change", {
target: {
value: ""
}
});
expect((0, _core.convertDateRangeToString)(mounter.state().value)).toBe("");
expect(mounter.find("Popover").at(0).props().visible).toBe(true);
(0, _testUtils.act)(function () {
mounter.find(".adui-date-day").at(15).simulate("click");
mounter.find(".adui-date-day").at(16).simulate("click");
jest.runAllTimers();
mounter.update();
});
});
it("DayPicker 操作", function () {
var today = new Date();
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, null));
var expectedRange = [];
(0, _testUtils.act)(function () {
wrapper.find(".adui-date-day").at(10).simulate("click");
expectedRange[0] = new Date(wrapper.find(".adui-date-day").at(10).props()["aria-label"] + " 12:00");
wrapper.find("button").at(1).simulate("click");
wrapper.find("button").at(1).simulate("click");
jest.runAllTimers();
wrapper.update();
});
(0, _testUtils.act)(function () {
wrapper.find(".adui-date-day").at(10).simulate("click");
expectedRange[1] = new Date(wrapper.find(".adui-date-day").at(10).props()["aria-label"] + " 12:00");
jest.runAllTimers();
wrapper.update();
expect((0, _core.convertDateRangeToString)(wrapper.state().value) === (0, _core.convertDateRangeToString)(expectedRange)).toBe(true);
});
(0, _testUtils.act)(function () {
wrapper.find(".adui-date-shortcut").at(0).simulate("keydown", {
key: "enter",
keyCode: 13
});
jest.runAllTimers();
wrapper.update();
expect((0, _core.convertDateRangeToString)(wrapper.state().value)).toBe("2020-10-01 - 2020-10-07");
});
var wrapperForCoverage0 = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, {
disabled: true
}));
wrapperForCoverage0.state().component.handleVisibleChange(false);
wrapperForCoverage0.find(".adui-date-day").at(14).simulate("mouseenter");
wrapperForCoverage0.find(".adui-date-day").at(14).simulate("mouseleave");
jest.runAllTimers();
});
it("测试 min max", function () {
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, {
minDate: new Date("2018-12-31"),
maxDate: new Date("2020-01-01")
}));
(0, _testUtils.act)(function () {
wrapper.find("select").at(0).simulate("change", {
target: {
value: "2019"
}
});
wrapper.find("select").at(1).simulate("change", {
target: {
value: "1"
}
});
jest.runAllTimers();
wrapper.update();
wrapper.find(".adui-date-day").at(14).simulate("click");
jest.runAllTimers();
wrapper.update();
wrapper.find("select").at(1).simulate("change", {
target: {
value: "11"
}
});
wrapper.find("select").at(0).simulate("change", {
target: {
value: "2020"
}
});
jest.runAllTimers();
wrapper.update();
wrapper.find(".adui-date-day").at(14).simulate("click");
jest.runAllTimers();
wrapper.update();
});
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSYW5nZVBpY2tlciIsIkRhdGVQaWNrZXIiLCJSYW5nZVBpY2tlck1vdW50ZXIiLCJzdGF0ZSIsImNvbXBvbmVudCIsInZhbHVlIiwiRGF0ZSIsInZpc2libGUiLCJsYWJlbCIsInNldFN0YXRlIiwidmFsIiwiYm9vbCIsInByb3BzIiwiQ29tcG9uZW50IiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJqZXN0IiwidXNlRmFrZVRpbWVycyIsImFmdGVyQWxsIiwidXNlUmVhbFRpbWVycyIsIml0Iiwid3JhcHBlciIsIlRlc3RSZW5kZXJlciIsImNyZWF0ZSIsImV4cGVjdCIsInRvTWF0Y2hTbmFwc2hvdCIsIm1vdW50IiwiZmluZCIsImF0IiwidG9CZSIsImNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyIsInNpbXVsYXRlIiwidGFyZ2V0IiwiYWN0Iiwia2V5Iiwia2V5Q29kZSIsInJ1bkFsbFRpbWVycyIsInVwZGF0ZSIsImV4cGVjdGVkVmFsIiwiYWR2YW5jZVRpbWVyc0J5VGltZSIsIm1vdW50ZXIiLCJ0b2RheSIsImV4cGVjdGVkUmFuZ2UiLCJ3cmFwcGVyRm9yQ292ZXJhZ2UwIiwiaGFuZGxlVmlzaWJsZUNoYW5nZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvX190ZXN0c19fL1JhbmdlUGlja2VyLnRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBtb3VudCB9IGZyb20gXCJlbnp5bWVcIlxuaW1wb3J0IFRlc3RSZW5kZXJlciBmcm9tIFwicmVhY3QtdGVzdC1yZW5kZXJlclwiXG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tIFwiLi5cIlxuaW1wb3J0IHsgY29udmVydERhdGVSYW5nZVRvU3RyaW5nLCBjb252ZXJ0RGF0ZVRvU3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIlxuaW1wb3J0IHsgYWN0IH0gZnJvbSBcInJlYWN0LWRvbS90ZXN0LXV0aWxzXCJcblxuY29uc3QgUmFuZ2VQaWNrZXIgPSBEYXRlUGlja2VyLlJhbmdlUGlja2VyXG5cbmNsYXNzIFJhbmdlUGlja2VyTW91bnRlciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRlID0ge1xuICAgIGNvbXBvbmVudDogbnVsbCxcbiAgICB2YWx1ZTogW25ldyBEYXRlKCksIG5ldyBEYXRlKCldLFxuICAgIHZpc2libGU6IHRydWUsXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgdmlzaWJsZSB9ID0gdGhpcy5zdGF0ZVxuICAgIHJldHVybiAoXG4gICAgICA8UmFuZ2VQaWNrZXJcbiAgICAgICAgc2hvcnRjdXRzPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IFwi56WW5Zu955Sf5pelXCIsXG4gICAgICAgICAgICB2YWx1ZTogW25ldyBEYXRlKFwiMjAyMC0xMC0wMVwiKSwgbmV3IERhdGUoXCIyMDIwLTEwLTA3XCIpXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICByZWY9eyhjb21wb25lbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhdGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29tcG9uZW50IH0pXG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWwpID0+IHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdmFsIH0pfVxuICAgICAgICBvblZpc2libGVDaGFuZ2U9eyhib29sKSA9PiB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogYm9vbCB9KX1cbiAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAvPlxuICAgIClcbiAgfVxufVxuXG5kZXNjcmliZShcIlJhbmdlUGlja2VyXCIsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBqZXN0LnVzZUZha2VUaW1lcnMoKVxuICB9KVxuXG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBqZXN0LnVzZVJlYWxUaW1lcnMoKVxuICB9KVxuXG4gIGl0KFwi5piv5ZCm5q2j56Gu5riy5p+TXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gVGVzdFJlbmRlcmVyLmNyZWF0ZSg8UmFuZ2VQaWNrZXIgLz4pXG4gICAgZXhwZWN0KHdyYXBwZXIpLnRvTWF0Y2hTbmFwc2hvdCgpXG4gIH0pXG5cbiAgaXQoXCLlhoXpg6jpqbHliqhcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IFtuZXcgRGF0ZShcIjIwMjAtMDItMDJcIiksIG5ldyBEYXRlKFwiMjAyMC0wMy0wMVwiKV1cbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8UmFuZ2VQaWNrZXIgZGVmYXVsdFZhbHVlPXt2YWx9IGRlZmF1bHRWaXNpYmxlPXtmYWxzZX0gY2xvc2VPblNlbGVjdCAvPlxuICAgIClcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWwpXG4gICAgKVxuXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJmb2N1c1wiKVxuXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG5cbiAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLnByb3BzKCkudmFsdWUpLnRvQmUoXCJcIilcblxuICAgIHdyYXBwZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTIyIC0gMjAyMC0wMi0yOFwiIH0gfSlcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikucHJvcHMoKS52YWx1ZSkudG9CZShcIjIwMjAtMDItMjIgLSAyMDIwLTAyLTI4XCIpXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJrZXlkb3duXCIsIHsga2V5OiBcImVudGVyXCIsIGtleUNvZGU6IDEzIH0pXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTUpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGNvbnN0IGV4cGVjdGVkVmFsID0gY29udmVydERhdGVSYW5nZVRvU3RyaW5nKFtcbiAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnByb3BzKClbXCJhcmlhLWxhYmVsXCJdICsgXCIgMTI6MDBcIlxuICAgICAgICApLFxuICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkucHJvcHMoKVtcImFyaWEtbGFiZWxcIl0gKyBcIiAxMjowMFwiXG4gICAgICAgICksXG4gICAgICBdKVxuICAgICAgLy8g562J5b6FIDM1MG1zXG4gICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMzUwKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCLlpJbpg6jmjqfliLZcIiwgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIOS7peS4i+mDveaYr+mqjOivgeWklumDqOaOp+WItuaXtuWGhemDqOeahOWkseaViFxuICAgICAqL1xuICAgIGNvbnN0IHZhbCA9IFtuZXcgRGF0ZSgpLCBuZXcgRGF0ZSgpXVxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxSYW5nZVBpY2tlciB2YWx1ZT17W25ldyBEYXRlKCksIG5ldyBEYXRlKCldfSB2aXNpYmxlIGNsb3NlT25TZWxlY3QgLz5cbiAgICApXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmF0KDApLnByb3BzKCkudmFsdWUpLnRvQmUoXG4gICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsKVxuICAgIClcblxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgLy8g562J5b6FIDM1MG1zXG4gICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMzUwKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmF0KDApLnByb3BzKCkudmFsdWUpLnRvQmUoXG4gICAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWwpXG4gICAgICApXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTYpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIC8vIOetieW+hSAzNTBtc1xuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDM1MClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsKVxuICAgICAgKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIC8qKlxuICAgICAqIOS7peS4i+aYr+mqjOivgeWklumDqOaOp+WItuaXtiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMg55qE5pyJ5pWIXG4gICAgICovXG4gICAgY29uc3QgbW91bnRlciA9IG1vdW50KDxSYW5nZVBpY2tlck1vdW50ZXIgLz4pXG4gICAgY29uc3QgdG9kYXkgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcobmV3IERhdGUoKSlcbiAgICBtb3VudGVyXG4gICAgICAuZmluZChcImlucHV0XCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAyMC0wMi0yMiAtIDIwMjAtMDItMjZcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhtb3VudGVyLnN0YXRlKCkudmFsdWUpKS50b0JlKFxuICAgICAgXCIyMDIwLTAyLTIyIC0gMjAyMC0wMi0yNlwiXG4gICAgKVxuICAgIG1vdW50ZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTI1IC0gMjAyMC0wMi0yNlwiIH0gfSlcbiAgICBleHBlY3QoY29udmVydERhdGVSYW5nZVRvU3RyaW5nKG1vdW50ZXIuc3RhdGUoKS52YWx1ZSkpLnRvQmUoXG4gICAgICBcIjIwMjAtMDItMjUgLSAyMDIwLTAyLTI2XCJcbiAgICApXG4gICAgbW91bnRlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiXCIgfSB9KVxuICAgIGV4cGVjdChjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcIlwiKVxuICAgIGV4cGVjdChtb3VudGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICBtb3VudGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgbW91bnRlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTYpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIG1vdW50ZXIudXBkYXRlKClcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwiRGF5UGlja2VyIOaTjeS9nFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxSYW5nZVBpY2tlck1vdW50ZXIgLz4pXG4gICAgY29uc3QgZXhwZWN0ZWRSYW5nZSA9IFtdXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDEwKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBleHBlY3RlZFJhbmdlWzBdID0gbmV3IERhdGUoXG4gICAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDEwKS5wcm9wcygpW1wiYXJpYS1sYWJlbFwiXSArIFwiIDEyOjAwXCJcbiAgICAgIClcbiAgICAgIHdyYXBwZXIuZmluZChcImJ1dHRvblwiKS5hdCgxKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICB3cmFwcGVyLmZpbmQoXCJidXR0b25cIikuYXQoMSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgIH0pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTApLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGV4cGVjdGVkUmFuZ2VbMV0gPSBuZXcgRGF0ZShcbiAgICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTApLnByb3BzKClbXCJhcmlhLWxhYmVsXCJdICsgXCIgMTI6MDBcIlxuICAgICAgKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcod3JhcHBlci5zdGF0ZSgpLnZhbHVlKSA9PT1cbiAgICAgICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoZXhwZWN0ZWRSYW5nZSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcIi5hZHVpLWRhdGUtc2hvcnRjdXRcIilcbiAgICAgICAgLmF0KDApXG4gICAgICAgIC5zaW11bGF0ZShcImtleWRvd25cIiwgeyBrZXk6IFwiZW50ZXJcIiwga2V5Q29kZTogMTMgfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdChjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcod3JhcHBlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcbiAgICAgICAgXCIyMDIwLTEwLTAxIC0gMjAyMC0xMC0wN1wiXG4gICAgICApXG4gICAgfSlcblxuICAgIGNvbnN0IHdyYXBwZXJGb3JDb3ZlcmFnZTAgPSBtb3VudCg8UmFuZ2VQaWNrZXJNb3VudGVyIGRpc2FibGVkIC8+KVxuICAgIHdyYXBwZXJGb3JDb3ZlcmFnZTAuc3RhdGUoKS5jb21wb25lbnQuaGFuZGxlVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICB3cmFwcGVyRm9yQ292ZXJhZ2UwLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJtb3VzZWVudGVyXCIpXG4gICAgd3JhcHBlckZvckNvdmVyYWdlMC5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwibW91c2VsZWF2ZVwiKVxuICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgfSlcblxuICBpdChcIua1i+ivlSBtaW4gbWF4XCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8UmFuZ2VQaWNrZXJNb3VudGVyXG4gICAgICAgIG1pbkRhdGU9e25ldyBEYXRlKFwiMjAxOC0xMi0zMVwiKX1cbiAgICAgICAgbWF4RGF0ZT17bmV3IERhdGUoXCIyMDIwLTAxLTAxXCIpfVxuICAgICAgLz5cbiAgICApXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCJzZWxlY3RcIilcbiAgICAgICAgLmF0KDApXG4gICAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDE5XCIgfSB9KVxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMSlcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjFcIiB9IH0pXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMSlcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjExXCIgfSB9KVxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMClcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMjBcIiB9IH0pXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLFdBQVcsR0FBR0MsWUFBQSxDQUFXRCxXQUEvQjs7SUFFTUUsa0I7Ozs7Ozs7Ozs7Ozs7OztVQUNKQyxLLEdBQVE7TUFDTkMsU0FBUyxFQUFFLElBREw7TUFFTkMsS0FBSyxFQUFFLENBQUMsSUFBSUMsSUFBSixFQUFELEVBQWEsSUFBSUEsSUFBSixF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