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>
274 lines (252 loc) • 35.6 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); }
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); }
import React, { Component } from "react";
import { mount } from "enzyme";
import TestRenderer from "react-test-renderer";
import DatePicker from "..";
import { convertDateRangeToString } from "../core";
import { act } from "react-dom/test-utils";
var RangePicker = DatePicker.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.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;
}(Component);
describe("RangePicker", function () {
beforeAll(function () {
jest.useFakeTimers();
});
afterAll(function () {
jest.useRealTimers();
});
it("是否正确渲染", function () {
var wrapper = TestRenderer.create(React.createElement(RangePicker, null));
expect(wrapper).toMatchSnapshot();
});
it("内部驱动", function () {
var val = [new Date("2020-02-02"), new Date("2020-03-01")];
var wrapper = mount(React.createElement(RangePicker, {
defaultValue: val,
defaultVisible: false,
closeOnSelect: true
}));
expect(wrapper.find("input").at(0).props().value).toBe(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");
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);
});
act(function () {
wrapper.find(".adui-date-day").at(14).simulate("click");
wrapper.find(".adui-date-day").at(15).simulate("click");
var expectedVal = 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 = mount(React.createElement(RangePicker, {
value: [new Date(), new Date()],
visible: true,
closeOnSelect: true
}));
expect(wrapper.find("input").at(0).props().value).toBe(convertDateRangeToString(val));
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
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(convertDateRangeToString(val));
});
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(convertDateRangeToString(val));
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
});
var mounter = mount(React.createElement(RangePickerMounter, null));
var today = convertDateRangeToString(new Date());
mounter.find("input").simulate("change", {
target: {
value: "2020-02-22 - 2020-02-26"
}
});
expect(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(convertDateRangeToString(mounter.state().value)).toBe("2020-02-25 - 2020-02-26");
mounter.find("input").simulate("change", {
target: {
value: ""
}
});
expect(convertDateRangeToString(mounter.state().value)).toBe("");
expect(mounter.find("Popover").at(0).props().visible).toBe(true);
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 = mount(React.createElement(RangePickerMounter, null));
var expectedRange = [];
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();
});
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(convertDateRangeToString(wrapper.state().value) === convertDateRangeToString(expectedRange)).toBe(true);
});
act(function () {
wrapper.find(".adui-date-shortcut").at(0).simulate("keydown", {
key: "enter",
keyCode: 13
});
jest.runAllTimers();
wrapper.update();
expect(convertDateRangeToString(wrapper.state().value)).toBe("2020-10-01 - 2020-10-07");
});
var wrapperForCoverage0 = mount(React.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 = mount(React.createElement(RangePickerMounter, {
minDate: new Date("2018-12-31"),
maxDate: new Date("2020-01-01")
}));
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbXBvbmVudCIsIm1vdW50IiwiVGVzdFJlbmRlcmVyIiwiRGF0ZVBpY2tlciIsImNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyIsImFjdCIsIlJhbmdlUGlja2VyIiwiUmFuZ2VQaWNrZXJNb3VudGVyIiwic3RhdGUiLCJjb21wb25lbnQiLCJ2YWx1ZSIsIkRhdGUiLCJ2aXNpYmxlIiwibGFiZWwiLCJzZXRTdGF0ZSIsInZhbCIsImJvb2wiLCJwcm9wcyIsImRlc2NyaWJlIiwiYmVmb3JlQWxsIiwiamVzdCIsInVzZUZha2VUaW1lcnMiLCJhZnRlckFsbCIsInVzZVJlYWxUaW1lcnMiLCJpdCIsIndyYXBwZXIiLCJjcmVhdGUiLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJmaW5kIiwiYXQiLCJ0b0JlIiwic2ltdWxhdGUiLCJ0YXJnZXQiLCJrZXkiLCJrZXlDb2RlIiwicnVuQWxsVGltZXJzIiwidXBkYXRlIiwiZXhwZWN0ZWRWYWwiLCJhZHZhbmNlVGltZXJzQnlUaW1lIiwibW91bnRlciIsInRvZGF5IiwiZXhwZWN0ZWRSYW5nZSIsIndyYXBwZXJGb3JDb3ZlcmFnZTAiLCJoYW5kbGVWaXNpYmxlQ2hhbmdlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9kYXRlLXBpY2tlci9fX3Rlc3RzX18vUmFuZ2VQaWNrZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IG1vdW50IH0gZnJvbSBcImVuenltZVwiXG5pbXBvcnQgVGVzdFJlbmRlcmVyIGZyb20gXCJyZWFjdC10ZXN0LXJlbmRlcmVyXCJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gXCIuLlwiXG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcsIGNvbnZlcnREYXRlVG9TdHJpbmcgfSBmcm9tIFwiLi4vY29yZVwiXG5pbXBvcnQgeyBhY3QgfSBmcm9tIFwicmVhY3QtZG9tL3Rlc3QtdXRpbHNcIlxuXG5jb25zdCBSYW5nZVBpY2tlciA9IERhdGVQaWNrZXIuUmFuZ2VQaWNrZXJcblxuY2xhc3MgUmFuZ2VQaWNrZXJNb3VudGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGUgPSB7XG4gICAgY29tcG9uZW50OiBudWxsLFxuICAgIHZhbHVlOiBbbmV3IERhdGUoKSwgbmV3IERhdGUoKV0sXG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHZhbHVlLCB2aXNpYmxlIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxSYW5nZVBpY2tlclxuICAgICAgICBzaG9ydGN1dHM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogXCLnpZblm73nlJ/ml6VcIixcbiAgICAgICAgICAgIHZhbHVlOiBbbmV3IERhdGUoXCIyMDIwLTEwLTAxXCIpLCBuZXcgRGF0ZShcIjIwMjAtMTAtMDdcIildLFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHJlZj17KGNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjb21wb25lbnQgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAgIGNsb3NlT25TZWxlY3RcbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICB2aXNpYmxlPXt2aXNpYmxlfVxuICAgICAgICBvbkNoYW5nZT17KHZhbCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB2YWwgfSl9XG4gICAgICAgIG9uVmlzaWJsZUNoYW5nZT17KGJvb2wpID0+IHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBib29sIH0pfVxuICAgICAgICB7Li4udGhpcy5wcm9wc31cbiAgICAgIC8+XG4gICAgKVxuICB9XG59XG5cbmRlc2NyaWJlKFwiUmFuZ2VQaWNrZXJcIiwgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGplc3QudXNlRmFrZVRpbWVycygpXG4gIH0pXG5cbiAgYWZ0ZXJBbGwoKCkgPT4ge1xuICAgIGplc3QudXNlUmVhbFRpbWVycygpXG4gIH0pXG5cbiAgaXQoXCLmmK/lkKbmraPnoa7muLLmn5NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBUZXN0UmVuZGVyZXIuY3JlYXRlKDxSYW5nZVBpY2tlciAvPilcbiAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KClcbiAgfSlcblxuICBpdChcIuWGhemDqOmpseWKqFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gW25ldyBEYXRlKFwiMjAyMC0wMi0wMlwiKSwgbmV3IERhdGUoXCIyMDIwLTAzLTAxXCIpXVxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxSYW5nZVBpY2tlciBkZWZhdWx0VmFsdWU9e3ZhbH0gZGVmYXVsdFZpc2libGU9e2ZhbHNlfSBjbG9zZU9uU2VsZWN0IC8+XG4gICAgKVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgY29udmVydERhdGVSYW5nZVRvU3RyaW5nKHZhbClcbiAgICApXG5cbiAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImZvY3VzXCIpXG5cbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUodHJ1ZSlcblxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIlwiIH0gfSlcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikucHJvcHMoKS52YWx1ZSkudG9CZShcIlwiKVxuXG4gICAgd3JhcHBlclxuICAgICAgLmZpbmQoXCJpbnB1dFwiKVxuICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMjAtMDItMjIgLSAyMDIwLTAyLTI4XCIgfSB9KVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5wcm9wcygpLnZhbHVlKS50b0JlKFwiMjAyMC0wMi0yMiAtIDIwMjAtMDItMjhcIilcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImtleWRvd25cIiwgeyBrZXk6IFwiZW50ZXJcIiwga2V5Q29kZTogMTMgfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgY29uc3QgZXhwZWN0ZWRWYWwgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoW1xuICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkucHJvcHMoKVtcImFyaWEtbGFiZWxcIl0gKyBcIiAxMjowMFwiXG4gICAgICAgICksXG4gICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5wcm9wcygpW1wiYXJpYS1sYWJlbFwiXSArIFwiIDEyOjAwXCJcbiAgICAgICAgKSxcbiAgICAgIF0pXG4gICAgICAvLyDnrYnlvoUgMzUwbXNcbiAgICAgIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzNTApXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBpdChcIuWklumDqOaOp+WItlwiLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICog5Lul5LiL6YO95piv6aqM6K+B5aSW6YOo5o6n5Yi25pe25YaF6YOo55qE5aSx5pWIXG4gICAgICovXG4gICAgY29uc3QgdmFsID0gW25ldyBEYXRlKCksIG5ldyBEYXRlKCldXG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgPFJhbmdlUGlja2VyIHZhbHVlPXtbbmV3IERhdGUoKSwgbmV3IERhdGUoKV19IHZpc2libGUgY2xvc2VPblNlbGVjdCAvPlxuICAgIClcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWwpXG4gICAgKVxuXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICAvLyDnrYnlvoUgMzUwbXNcbiAgICAgIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzNTApXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgICAgY29udmVydERhdGVSYW5nZVRvU3RyaW5nKHZhbClcbiAgICAgIClcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNikuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgLy8g562J5b6FIDM1MG1zXG4gICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMzUwKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmF0KDApLnByb3BzKCkudmFsdWUpLnRvQmUoXG4gICAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWwpXG4gICAgICApXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgLyoqXG4gICAgICog5Lul5LiL5piv6aqM6K+B5aSW6YOo5o6n5Yi25pe2IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyDnmoTmnInmlYhcbiAgICAgKi9cbiAgICBjb25zdCBtb3VudGVyID0gbW91bnQoPFJhbmdlUGlja2VyTW91bnRlciAvPilcbiAgICBjb25zdCB0b2RheSA9IGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhuZXcgRGF0ZSgpKVxuICAgIG1vdW50ZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTIyIC0gMjAyMC0wMi0yNlwiIH0gfSlcbiAgICBleHBlY3QoY29udmVydERhdGVSYW5nZVRvU3RyaW5nKG1vdW50ZXIuc3RhdGUoKS52YWx1ZSkpLnRvQmUoXG4gICAgICBcIjIwMjAtMDItMjIgLSAyMDIwLTAyLTI2XCJcbiAgICApXG4gICAgbW91bnRlclxuICAgICAgLmZpbmQoXCJpbnB1dFwiKVxuICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMjAtMDItMjUgLSAyMDIwLTAyLTI2XCIgfSB9KVxuICAgIGV4cGVjdChjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcbiAgICAgIFwiMjAyMC0wMi0yNSAtIDIwMjAtMDItMjZcIlxuICAgIClcbiAgICBtb3VudGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhtb3VudGVyLnN0YXRlKCkudmFsdWUpKS50b0JlKFwiXCIpXG4gICAgZXhwZWN0KG1vdW50ZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIG1vdW50ZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBtb3VudGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNikuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgbW91bnRlci51cGRhdGUoKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJEYXlQaWNrZXIg5pON5L2cXCIsICgpID0+IHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKClcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPFJhbmdlUGlja2VyTW91bnRlciAvPilcbiAgICBjb25zdCBleHBlY3RlZFJhbmdlID0gW11cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTApLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGV4cGVjdGVkUmFuZ2VbMF0gPSBuZXcgRGF0ZShcbiAgICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTApLnByb3BzKClbXCJhcmlhLWxhYmVsXCJdICsgXCIgMTI6MDBcIlxuICAgICAgKVxuICAgICAgd3JhcHBlci5maW5kKFwiYnV0dG9uXCIpLmF0KDEpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIHdyYXBwZXIuZmluZChcImJ1dHRvblwiKS5hdCgxKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxMCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgZXhwZWN0ZWRSYW5nZVsxXSA9IG5ldyBEYXRlKFxuICAgICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxMCkucHJvcHMoKVtcImFyaWEtbGFiZWxcIl0gKyBcIiAxMjowMFwiXG4gICAgICApXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh3cmFwcGVyLnN0YXRlKCkudmFsdWUpID09PVxuICAgICAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhleHBlY3RlZFJhbmdlKVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwiLmFkdWktZGF0ZS1zaG9ydGN1dFwiKVxuICAgICAgICAuYXQoMClcbiAgICAgICAgLnNpbXVsYXRlKFwia2V5ZG93blwiLCB7IGtleTogXCJlbnRlclwiLCBrZXlDb2RlOiAxMyB9KVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh3cmFwcGVyLnN0YXRlKCkudmFsdWUpKS50b0JlKFxuICAgICAgICBcIjIwMjAtMTAtMDEgLSAyMDIwLTEwLTA3XCJcbiAgICAgIClcbiAgICB9KVxuXG4gICAgY29uc3Qgd3JhcHBlckZvckNvdmVyYWdlMCA9IG1vdW50KDxSYW5nZVBpY2tlck1vdW50ZXIgZGlzYWJsZWQgLz4pXG4gICAgd3JhcHBlckZvckNvdmVyYWdlMC5zdGF0ZSgpLmNvbXBvbmVudC5oYW5kbGVWaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICAgIHdyYXBwZXJGb3JDb3ZlcmFnZTAuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcIm1vdXNlZW50ZXJcIilcbiAgICB3cmFwcGVyRm9yQ292ZXJhZ2UwLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJtb3VzZWxlYXZlXCIpXG4gICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICB9KVxuXG4gIGl0KFwi5rWL6K+VIG1pbiBtYXhcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxSYW5nZVBpY2tlck1vdW50ZXJcbiAgICAgICAgbWluRGF0ZT17bmV3IERhdGUoXCIyMDE4LTEyLTMxXCIpfVxuICAgICAgICBtYXhEYXRlPXtuZXcgRGF0ZShcIjIwMjAtMDEtMDFcIil9XG4gICAgICAvPlxuICAgIClcbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMClcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMTlcIiB9IH0pXG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwic2VsZWN0XCIpXG4gICAgICAgIC5hdCgxKVxuICAgICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMVwiIH0gfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwic2VsZWN0XCIpXG4gICAgICAgIC5hdCgxKVxuICAgICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTFcIiB9IH0pXG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwic2VsZWN0XCIpXG4gICAgICAgIC5hdCgwKVxuICAgICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAyMFwiIH0gfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgfSlcbiAgfSlcbn0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLE9BQU9BLEtBQVAsSUFBZ0JDLFNBQWhCLFFBQWlDLE9BQWpDO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixRQUF0QjtBQUNBLE9BQU9DLFlBQVAsTUFBeUIscUJBQXpCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixJQUF2QjtBQUNBLFNBQVNDLHdCQUFULFFBQThELFNBQTlEO0FBQ0EsU0FBU0MsR0FBVCxRQUFvQixzQkFBcEI7QUFF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