@garrix82/reactgenie-lib 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/.env.example +22 -0
  2. package/.github/workflows/publish.yml +20 -0
  3. package/LICENSE.txt +201 -0
  4. package/README.md +621 -0
  5. package/babel.config.js +29 -0
  6. package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
  7. package/dist/adapters/expo-router-adapter.d.ts +16 -0
  8. package/dist/adapters/expo-router-adapter.js +521 -0
  9. package/dist/adapters/navigation-adapter.d.ts +20 -0
  10. package/dist/adapters/navigation-adapter.js +137 -0
  11. package/dist/audio-visualizer.d.ts +14 -0
  12. package/dist/audio-visualizer.js +123 -0
  13. package/dist/current-selection.d.ts +27 -0
  14. package/dist/current-selection.js +94 -0
  15. package/dist/errors.d.ts +19 -0
  16. package/dist/errors.js +37 -0
  17. package/dist/genie/DateTime.d.ts +66 -0
  18. package/dist/genie/DateTime.js +399 -0
  19. package/dist/genie/TimeDelta.d.ts +35 -0
  20. package/dist/genie/TimeDelta.js +169 -0
  21. package/dist/genie-view-wrapper.d.ts +1 -0
  22. package/dist/genie-view-wrapper.js +377 -0
  23. package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
  24. package/dist/hooks/useSpeechRecognition.d.ts +28 -0
  25. package/dist/hooks/useSpeechRecognition.js +118 -0
  26. package/dist/index.d.ts +30 -0
  27. package/dist/index.js +469 -0
  28. package/dist/logger.d.ts +23 -0
  29. package/dist/logger.js +597 -0
  30. package/dist/logger.remote.test.d.ts +0 -0
  31. package/dist/modality-provider-v2.d.ts +28 -0
  32. package/dist/modality-provider-v2.js +1321 -0
  33. package/dist/modality-provider.d.ts +22 -0
  34. package/dist/modality-provider.js +373 -0
  35. package/dist/native-visibility.d.ts +28 -0
  36. package/dist/native-visibility.js +50 -0
  37. package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
  38. package/dist/platform/VoiceRecognitionBar.js +332 -0
  39. package/dist/platform/components.d.ts +32 -0
  40. package/dist/platform/components.js +351 -0
  41. package/dist/platform/events.d.ts +31 -0
  42. package/dist/platform/events.js +274 -0
  43. package/dist/platform/index.d.ts +3 -0
  44. package/dist/platform/index.js +39 -0
  45. package/dist/platform/types.d.ts +79 -0
  46. package/dist/platform/types.js +97 -0
  47. package/dist/react-decorators.d.ts +87 -0
  48. package/dist/react-decorators.js +368 -0
  49. package/dist/shared-store.d.ts +74 -0
  50. package/dist/shared-store.js +589 -0
  51. package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
  52. package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
  53. package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
  54. package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
  55. package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
  56. package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
  57. package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
  58. package/dist/speech-recognition/speech-recognition-groq.js +409 -0
  59. package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
  60. package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
  61. package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
  62. package/dist/speech-recognition/speech-recognition-native.js +632 -0
  63. package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
  64. package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
  65. package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
  66. package/dist/speech-recognition/speech-recognition-openai.js +718 -0
  67. package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
  68. package/dist/speech-recognition/speech-recognition-unified.js +589 -0
  69. package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
  70. package/dist/speech-recognition/utils/groq-transcription.js +382 -0
  71. package/dist/speech-recognition.d.ts +7 -0
  72. package/dist/speech-recognition.js +61 -0
  73. package/dist/voice-pipeline-telemetry.d.ts +26 -0
  74. package/dist/voice-pipeline-telemetry.js +15 -0
  75. package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
  76. package/metro/index.js +3 -0
  77. package/metro/with-genie-registry.js +47 -0
  78. package/package.json +111 -0
  79. package/scripts/dry-run.js +23 -0
  80. package/scripts/generate-genie-registry.js +278 -0
  81. package/scripts/log-file-test.js +51 -0
  82. package/scripts/parse.js +26 -0
  83. package/scripts/prompt.js +19 -0
  84. package/scripts/set-script.js +200 -0
  85. package/tsconfig.json +36 -0
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TimeDelta = void 0;
7
+ var _reactgenieDsl = require("@garrix82/reactgenie-dsl");
8
+ require("reflect-metadata");
9
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _dec1, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _class, _class2, _descriptor, _descriptor2, _descriptor3, _TimeDelta;
10
+ function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
11
+ function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
12
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
13
+ let TimeDelta = exports.TimeDelta = (_dec = (0, _reactgenieDsl.GenieClass)("Delta time"), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [Object]), _dec4 = Reflect.metadata("design:destructuringparamtypes", [{
14
+ hour: {
15
+ type: Number,
16
+ optional: true
17
+ },
18
+ minute: {
19
+ type: Number,
20
+ optional: true
21
+ },
22
+ second: {
23
+ type: Number,
24
+ optional: true
25
+ }
26
+ }]), _dec5 = Reflect.metadata("design:destructuringparamvalues", [{
27
+ hour: "0",
28
+ minute: "0",
29
+ second: "0"
30
+ }]), _dec6 = (0, _reactgenieDsl.GenieProperty)(), _dec7 = Reflect.metadata("design:type", Number), _dec8 = (0, _reactgenieDsl.GenieProperty)(), _dec9 = Reflect.metadata("design:type", Number), _dec0 = (0, _reactgenieDsl.GenieProperty)(), _dec1 = Reflect.metadata("design:type", Number), _dec10 = (0, _reactgenieDsl.GenieFunction)("Create a new TimeDelta object"), _dec11 = Reflect.metadata("design:type", Function), _dec12 = Reflect.metadata("design:paramtypes", [Object]), _dec13 = Reflect.metadata("design:returntype", "TimeDelta"), _dec14 = Reflect.metadata("design:is_static", true), _dec15 = Reflect.metadata("design:destructuringparamtypes", [{
31
+ hour: {
32
+ type: Number,
33
+ optional: true
34
+ },
35
+ minute: {
36
+ type: Number,
37
+ optional: true
38
+ },
39
+ second: {
40
+ type: Number,
41
+ optional: true
42
+ }
43
+ }]), _dec16 = Reflect.metadata("design:destructuringparamvalues", [{
44
+ hour: "0",
45
+ minute: "0",
46
+ second: "0"
47
+ }]), _dec17 = (0, _reactgenieDsl.GenieFunction)("Add a offset to the time"), _dec18 = Reflect.metadata("design:type", Function), _dec19 = Reflect.metadata("design:paramtypes", [Object]), _dec20 = Reflect.metadata("design:returntype", "void"), _dec21 = Reflect.metadata("design:destructuringparamtypes", [{
48
+ hour: {
49
+ type: Number,
50
+ optional: true
51
+ },
52
+ minute: {
53
+ type: Number,
54
+ optional: true
55
+ },
56
+ second: {
57
+ type: Number,
58
+ optional: true
59
+ }
60
+ }]), _dec22 = Reflect.metadata("design:destructuringparamvalues", [{
61
+ hour: "0",
62
+ minute: "0",
63
+ second: "0"
64
+ }]), _dec23 = (0, _reactgenieDsl.GenieFunction)("Set the value to the time"), _dec24 = Reflect.metadata("design:type", Function), _dec25 = Reflect.metadata("design:paramtypes", [Object]), _dec26 = Reflect.metadata("design:returntype", "void"), _dec27 = Reflect.metadata("design:destructuringparamtypes", [{
65
+ hour: {
66
+ type: Number,
67
+ optional: true
68
+ },
69
+ minute: {
70
+ type: Number,
71
+ optional: true
72
+ },
73
+ second: {
74
+ type: Number,
75
+ optional: true
76
+ }
77
+ }]), _dec28 = Reflect.metadata("design:destructuringparamvalues", [{
78
+ hour: "0",
79
+ minute: "0",
80
+ second: "0"
81
+ }]), _dec29 = (0, _reactgenieDsl.GenieFunction)("Get the second of the TimeDelta object"), _dec30 = Reflect.metadata("design:type", Function), _dec31 = Reflect.metadata("design:paramtypes", []), _dec32 = Reflect.metadata("design:returntype", Number), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = _dec5(_class = (_class2 = (_TimeDelta = class TimeDelta extends _reactgenieDsl.HelperClass {
82
+ constructor({
83
+ hour = 0,
84
+ minute = 0,
85
+ second = 0
86
+ }) {
87
+ super({});
88
+ _initializerDefineProperty(this, "hour", _descriptor, this);
89
+ _initializerDefineProperty(this, "minute", _descriptor2, this);
90
+ _initializerDefineProperty(this, "second", _descriptor3, this);
91
+ this.hour = hour;
92
+ this.minute = minute;
93
+ this.second = second;
94
+ }
95
+ static setup() {}
96
+
97
+ // custom comparator for sorting
98
+ static compare(a, b) {
99
+ console.log(a.getLeftSecond(), b.getLeftSecond());
100
+ return a.getLeftSecond() - b.getLeftSecond();
101
+ }
102
+ static CreateTimeDelta({
103
+ hour = 0,
104
+ minute = 0,
105
+ second = 0
106
+ }) {
107
+ return TimeDelta.CreateObject({
108
+ hour: hour,
109
+ minute: minute,
110
+ second: second
111
+ });
112
+ }
113
+ addOffset({
114
+ hour = 0,
115
+ minute = 0,
116
+ second = 0
117
+ }) {
118
+ const offsettime = this.getLeftSecond() + hour * 3600 + minute * 60 + second;
119
+ if (offsettime < 0) {
120
+ this.hour = 0;
121
+ this.minute = 0;
122
+ this.second = 0;
123
+ return;
124
+ }
125
+ this.hour = Math.floor(offsettime / 3600);
126
+ this.minute = Math.floor(offsettime % 3600 / 60);
127
+ this.second = offsettime % 60;
128
+ }
129
+ setTime({
130
+ hour = 0,
131
+ minute = 0,
132
+ second = 0
133
+ }) {
134
+ this.hour = hour;
135
+ this.minute = minute;
136
+ this.second = second;
137
+ }
138
+ getLeftSecond() {
139
+ return this.second + this.minute * 60 + this.hour * 3600;
140
+ }
141
+ toString() {
142
+ return `${this.hour}:${this.minute}:${this.second}`;
143
+ }
144
+ }, _TimeDelta.Examples = [{
145
+ user_utterance: "20 minutes later",
146
+ example_parsed: "TimeDelta.CreateObject(minute: 20)"
147
+ }, {
148
+ user_utterance: "1hour later",
149
+ example_parsed: "TimeDelta.CreateObject(hour: 1)"
150
+ }, {
151
+ user_utterance: "1hour 20 minutes later",
152
+ example_parsed: "TimeDelta.CreateObject(hour: 1, minute: 20)"
153
+ }], _TimeDelta), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "hour", [_dec6, _dec7], {
154
+ configurable: true,
155
+ enumerable: true,
156
+ writable: true,
157
+ initializer: null
158
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "minute", [_dec8, _dec9], {
159
+ configurable: true,
160
+ enumerable: true,
161
+ writable: true,
162
+ initializer: null
163
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "second", [_dec0, _dec1], {
164
+ configurable: true,
165
+ enumerable: true,
166
+ writable: true,
167
+ initializer: null
168
+ }), _applyDecoratedDescriptor(_class2, "CreateTimeDelta", [_dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16], Object.getOwnPropertyDescriptor(_class2, "CreateTimeDelta"), _class2), _applyDecoratedDescriptor(_class2.prototype, "addOffset", [_dec17, _dec18, _dec19, _dec20, _dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "addOffset"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setTime", [_dec23, _dec24, _dec25, _dec26, _dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "setTime"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getLeftSecond", [_dec29, _dec30, _dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "getLeftSecond"), _class2.prototype), _class2)) || _class) || _class) || _class) || _class) || _class);
169
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RnZW5pZURzbCIsInJlcXVpcmUiLCJfZGVjIiwiX2RlYzIiLCJfZGVjMyIsIl9kZWM0IiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMwIiwiX2RlYzEiLCJfZGVjMTAiLCJfZGVjMTEiLCJfZGVjMTIiLCJfZGVjMTMiLCJfZGVjMTQiLCJfZGVjMTUiLCJfZGVjMTYiLCJfZGVjMTciLCJfZGVjMTgiLCJfZGVjMTkiLCJfZGVjMjAiLCJfZGVjMjEiLCJfZGVjMjIiLCJfZGVjMjMiLCJfZGVjMjQiLCJfZGVjMjUiLCJfZGVjMjYiLCJfZGVjMjciLCJfZGVjMjgiLCJfZGVjMjkiLCJfZGVjMzAiLCJfZGVjMzEiLCJfZGVjMzIiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX2Rlc2NyaXB0b3IiLCJfZGVzY3JpcHRvcjIiLCJfZGVzY3JpcHRvcjMiLCJfVGltZURlbHRhIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJlIiwiaSIsInIiLCJsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ2YWx1ZSIsImluaXRpYWxpemVyIiwiY2FsbCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJuIiwiYSIsImtleXMiLCJmb3JFYWNoIiwic2xpY2UiLCJyZXZlcnNlIiwicmVkdWNlIiwiX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciIsIkVycm9yIiwiVGltZURlbHRhIiwiZXhwb3J0cyIsIkdlbmllQ2xhc3MiLCJSZWZsZWN0IiwibWV0YWRhdGEiLCJGdW5jdGlvbiIsImhvdXIiLCJ0eXBlIiwiTnVtYmVyIiwib3B0aW9uYWwiLCJtaW51dGUiLCJzZWNvbmQiLCJHZW5pZVByb3BlcnR5IiwiR2VuaWVGdW5jdGlvbiIsIkhlbHBlckNsYXNzIiwiY29uc3RydWN0b3IiLCJzZXR1cCIsImNvbXBhcmUiLCJiIiwiY29uc29sZSIsImxvZyIsImdldExlZnRTZWNvbmQiLCJDcmVhdGVUaW1lRGVsdGEiLCJDcmVhdGVPYmplY3QiLCJhZGRPZmZzZXQiLCJvZmZzZXR0aW1lIiwiTWF0aCIsImZsb29yIiwic2V0VGltZSIsInRvU3RyaW5nIiwiRXhhbXBsZXMiLCJ1c2VyX3V0dGVyYW5jZSIsImV4YW1wbGVfcGFyc2VkIiwicHJvdG90eXBlIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlbmllL1RpbWVEZWx0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHZW5pZUNsYXNzLFxuICBIZWxwZXJDbGFzcyxcbiAgR2VuaWVQcm9wZXJ0eSxcbiAgR2VuaWVGdW5jdGlvbixcbn0gZnJvbSBcIkBnYXJyaXg4Mi9yZWFjdGdlbmllLWRzbFwiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuXG5AR2VuaWVDbGFzcyhcIkRlbHRhIHRpbWVcIilcbmV4cG9ydCBjbGFzcyBUaW1lRGVsdGEgZXh0ZW5kcyBIZWxwZXJDbGFzcyB7XG4gIEBHZW5pZVByb3BlcnR5KClcbiAgcHVibGljIGhvdXI6IG51bWJlcjtcbiAgQEdlbmllUHJvcGVydHkoKVxuICBwdWJsaWMgbWludXRlOiBudW1iZXI7XG4gIEBHZW5pZVByb3BlcnR5KClcbiAgcHVibGljIHNlY29uZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBob3VyID0gMCxcbiAgICBtaW51dGUgPSAwLFxuICAgIHNlY29uZCA9IDAsXG4gIH06IHtcbiAgICBob3VyPzogbnVtYmVyO1xuICAgIG1pbnV0ZT86IG51bWJlcjtcbiAgICBzZWNvbmQ/OiBudW1iZXI7XG4gIH0pIHtcbiAgICBzdXBlcih7fSk7XG4gICAgdGhpcy5ob3VyID0gaG91cjtcbiAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZTtcbiAgICB0aGlzLnNlY29uZCA9IHNlY29uZDtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cCgpIHt9XG5cbiAgLy8gY3VzdG9tIGNvbXBhcmF0b3IgZm9yIHNvcnRpbmdcbiAgc3RhdGljIGNvbXBhcmUoYTogVGltZURlbHRhLCBiOiBUaW1lRGVsdGEpIHtcbiAgICBjb25zb2xlLmxvZyhhLmdldExlZnRTZWNvbmQoKSwgYi5nZXRMZWZ0U2Vjb25kKCkpO1xuICAgIHJldHVybiBhLmdldExlZnRTZWNvbmQoKSAtIGIuZ2V0TGVmdFNlY29uZCgpO1xuICB9XG5cbiAgQEdlbmllRnVuY3Rpb24oXCJDcmVhdGUgYSBuZXcgVGltZURlbHRhIG9iamVjdFwiKVxuICBzdGF0aWMgQ3JlYXRlVGltZURlbHRhKHtcbiAgICBob3VyID0gMCxcbiAgICBtaW51dGUgPSAwLFxuICAgIHNlY29uZCA9IDAsXG4gIH06IHtcbiAgICBob3VyPzogbnVtYmVyO1xuICAgIG1pbnV0ZT86IG51bWJlcjtcbiAgICBzZWNvbmQ/OiBudW1iZXI7XG4gIH0pOiBUaW1lRGVsdGEge1xuICAgIHJldHVybiBUaW1lRGVsdGEuQ3JlYXRlT2JqZWN0KHtcbiAgICAgIGhvdXI6IGhvdXIsXG4gICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgIH0pO1xuICB9XG5cbiAgQEdlbmllRnVuY3Rpb24oXCJBZGQgYSBvZmZzZXQgdG8gdGhlIHRpbWVcIilcbiAgYWRkT2Zmc2V0KHtcbiAgICBob3VyID0gMCxcbiAgICBtaW51dGUgPSAwLFxuICAgIHNlY29uZCA9IDAsXG4gIH06IHtcbiAgICBob3VyPzogbnVtYmVyO1xuICAgIG1pbnV0ZT86IG51bWJlcjtcbiAgICBzZWNvbmQ/OiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBvZmZzZXR0aW1lID1cbiAgICAgIHRoaXMuZ2V0TGVmdFNlY29uZCgpICsgaG91ciAqIDM2MDAgKyBtaW51dGUgKiA2MCArIHNlY29uZDtcbiAgICBpZiAob2Zmc2V0dGltZSA8IDApIHtcbiAgICAgIHRoaXMuaG91ciA9IDA7XG4gICAgICB0aGlzLm1pbnV0ZSA9IDA7XG4gICAgICB0aGlzLnNlY29uZCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaG91ciA9IE1hdGguZmxvb3Iob2Zmc2V0dGltZSAvIDM2MDApO1xuICAgIHRoaXMubWludXRlID0gTWF0aC5mbG9vcigob2Zmc2V0dGltZSAlIDM2MDApIC8gNjApO1xuICAgIHRoaXMuc2Vjb25kID0gb2Zmc2V0dGltZSAlIDYwO1xuICB9XG5cbiAgQEdlbmllRnVuY3Rpb24oXCJTZXQgdGhlIHZhbHVlIHRvIHRoZSB0aW1lXCIpXG4gIHNldFRpbWUoe1xuICAgIGhvdXIgPSAwLFxuICAgIG1pbnV0ZSA9IDAsXG4gICAgc2Vjb25kID0gMCxcbiAgfToge1xuICAgIGhvdXI/OiBudW1iZXI7XG4gICAgbWludXRlPzogbnVtYmVyO1xuICAgIHNlY29uZD86IG51bWJlcjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMuaG91ciA9IGhvdXI7XG4gICAgdGhpcy5taW51dGUgPSBtaW51dGU7XG4gICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gIH1cblxuICBAR2VuaWVGdW5jdGlvbihcIkdldCB0aGUgc2Vjb25kIG9mIHRoZSBUaW1lRGVsdGEgb2JqZWN0XCIpXG4gIGdldExlZnRTZWNvbmQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWNvbmQgKyB0aGlzLm1pbnV0ZSAqIDYwICsgdGhpcy5ob3VyICogMzYwMDtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmhvdXJ9OiR7dGhpcy5taW51dGV9OiR7dGhpcy5zZWNvbmR9YDtcbiAgfVxuXG4gIHN0YXRpYyBFeGFtcGxlcyA9IFtcbiAgICB7XG4gICAgICB1c2VyX3V0dGVyYW5jZTogXCIyMCBtaW51dGVzIGxhdGVyXCIsXG4gICAgICBleGFtcGxlX3BhcnNlZDogXCJUaW1lRGVsdGEuQ3JlYXRlT2JqZWN0KG1pbnV0ZTogMjApXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB1c2VyX3V0dGVyYW5jZTogXCIxaG91ciBsYXRlclwiLFxuICAgICAgZXhhbXBsZV9wYXJzZWQ6IFwiVGltZURlbHRhLkNyZWF0ZU9iamVjdChob3VyOiAxKVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdXNlcl91dHRlcmFuY2U6IFwiMWhvdXIgMjAgbWludXRlcyBsYXRlclwiLFxuICAgICAgZXhhbXBsZV9wYXJzZWQ6IFwiVGltZURlbHRhLkNyZWF0ZU9iamVjdChob3VyOiAxLCBtaW51dGU6IDIwKVwiLFxuICAgIH0sXG4gIF07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGNBQUEsR0FBQUMsT0FBQTtBQU1BQSxPQUFBO0FBQTBCLElBQUFDLElBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxPQUFBLEVBQUFDLFdBQUEsRUFBQUMsWUFBQSxFQUFBQyxZQUFBLEVBQUFDLFVBQUE7QUFBQSxTQUFBQywyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxJQUFBRCxDQUFBLElBQUFFLE1BQUEsQ0FBQUMsY0FBQSxDQUFBTCxDQUFBLEVBQUFDLENBQUEsSUFBQUssVUFBQSxFQUFBSixDQUFBLENBQUFJLFVBQUEsRUFBQUMsWUFBQSxFQUFBTCxDQUFBLENBQUFLLFlBQUEsRUFBQUMsUUFBQSxFQUFBTixD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
@@ -0,0 +1 @@
1
+ export declare const GenieViewWrapper: (className: string, childComponent: any, childParams: any[]) => () => any;
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GenieViewWrapper = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _reactDecorators = require("./react-decorators");
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
+ const FallbackNavigationContext = /*#__PURE__*/_react.default.createContext(undefined);
12
+ let MaybeNavigationContext = FallbackNavigationContext;
13
+ try {
14
+ const reactNavigation = require("@react-navigation/native");
15
+ if (reactNavigation?.NavigationContext) {
16
+ MaybeNavigationContext = reactNavigation.NavigationContext;
17
+ }
18
+ } catch {
19
+ MaybeNavigationContext = FallbackNavigationContext;
20
+ }
21
+
22
+ /**
23
+ * Cross-platform GenieViewWrapper using React Native primitives.
24
+ * Works on web, iOS, and Android.
25
+ *
26
+ * Uses:
27
+ * - View instead of div
28
+ * - onLayout for tracking component bounds
29
+ * - Platform-specific visibility detection
30
+ */
31
+ const GenieViewWrapper = (className, childComponent, childParams) => () => {
32
+ const interfaceId = (0, _react.useMemo)(() => Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15), []);
33
+ const viewRef = (0, _react.useRef)(null);
34
+ const [layout, setLayout] = (0, _react.useState)({
35
+ x: 0,
36
+ y: 0,
37
+ width: 0,
38
+ height: 0
39
+ });
40
+ const layoutRef = (0, _react.useRef)(layout);
41
+ const [isVisible, setIsVisible] = (0, _react.useState)(true); // Assume visible on native
42
+ const isVisibleRef = (0, _react.useRef)(true); // Keep a ref to the latest value
43
+ const keyRef = (0, _react.useRef)(childParams[0]);
44
+ const navigation = _react.default.useContext(MaybeNavigationContext);
45
+ const [isFocusedScreen, setIsFocusedScreen] = (0, _react.useState)(() => {
46
+ if (_reactNative.Platform.OS === "web") {
47
+ return true;
48
+ }
49
+ if (!navigation || typeof navigation.isFocused !== "function") {
50
+ return undefined;
51
+ }
52
+ return !!navigation.isFocused();
53
+ });
54
+ const isScreenViewWrapper = (0, _react.useMemo)(() => {
55
+ const componentName = childComponent?.name ?? "";
56
+ return /View$/.test(componentName);
57
+ }, [childComponent]);
58
+ (0, _react.useEffect)(() => {
59
+ if (_reactNative.Platform.OS === "web") {
60
+ setIsFocusedScreen(true);
61
+ return;
62
+ }
63
+ if (!navigation || typeof navigation.isFocused !== "function") {
64
+ setIsFocusedScreen(undefined);
65
+ return;
66
+ }
67
+ setIsFocusedScreen(!!navigation.isFocused());
68
+ const focusUnsubscribe = typeof navigation.addListener === "function" ? navigation.addListener("focus", () => setIsFocusedScreen(true)) : undefined;
69
+ const blurUnsubscribe = typeof navigation.addListener === "function" ? navigation.addListener("blur", () => setIsFocusedScreen(false)) : undefined;
70
+ return () => {
71
+ focusUnsubscribe?.();
72
+ blurUnsubscribe?.();
73
+ };
74
+ }, [navigation]);
75
+ (0, _react.useEffect)(() => {
76
+ isVisibleRef.current = isVisible;
77
+ }, [isVisible]);
78
+ (0, _react.useEffect)(() => {
79
+ layoutRef.current = layout;
80
+ }, [layout]);
81
+ const isRectInViewport = (0, _react.useCallback)(rect => {
82
+ if (rect.width <= 0 || rect.height <= 0) {
83
+ return false;
84
+ }
85
+ let viewportWidth = 0;
86
+ let viewportHeight = 0;
87
+ if (typeof window !== "undefined" && typeof window.innerWidth === "number" && typeof window.innerHeight === "number") {
88
+ viewportWidth = window.innerWidth;
89
+ viewportHeight = window.innerHeight;
90
+ } else {
91
+ const viewport = _reactNative.Dimensions.get("window");
92
+ viewportWidth = viewport.width;
93
+ viewportHeight = viewport.height;
94
+ }
95
+ const right = rect.x + rect.width;
96
+ const bottom = rect.y + rect.height;
97
+ return right > 0 && bottom > 0 && rect.x < viewportWidth && rect.y < viewportHeight;
98
+ }, []);
99
+ const registerRect = (0, _react.useCallback)((rect, visible = isVisibleRef.current) => {
100
+ const hasMeasuredSize = rect.width > 0 && rect.height > 0;
101
+ if (!visible || hasMeasuredSize && !isRectInViewport(rect)) {
102
+ delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
103
+ return;
104
+ }
105
+ _reactDecorators.AllGenieDisplayedInstances[interfaceId] = () => ({
106
+ className: className,
107
+ key: keyRef.current,
108
+ isFocusedScreen,
109
+ rect: {
110
+ x: rect.x,
111
+ y: rect.y,
112
+ width: rect.width,
113
+ height: rect.height,
114
+ top: rect.y,
115
+ left: rect.x,
116
+ bottom: rect.y + rect.height,
117
+ right: rect.x + rect.width
118
+ }
119
+ });
120
+ }, [className, interfaceId, isFocusedScreen, isRectInViewport]);
121
+ const updateRectFromCurrentNode = (0, _react.useCallback)((fallbackRect, preferredRect) => {
122
+ if (_reactNative.Platform.OS === "web") {
123
+ if (preferredRect) {
124
+ layoutRef.current = preferredRect;
125
+ registerRect(preferredRect);
126
+ return;
127
+ }
128
+ const webNode = viewRef.current;
129
+ if (webNode?.getBoundingClientRect) {
130
+ const domRect = webNode.getBoundingClientRect();
131
+ const measuredRect = {
132
+ x: domRect.left,
133
+ y: domRect.top,
134
+ width: domRect.width,
135
+ height: domRect.height
136
+ };
137
+ layoutRef.current = measuredRect;
138
+ registerRect(measuredRect);
139
+ return;
140
+ }
141
+ if (webNode?.measure) {
142
+ webNode.measure((_x, _y, width, height, pageX, pageY) => {
143
+ const measuredRect = {
144
+ x: pageX ?? fallbackRect?.x ?? 0,
145
+ y: pageY ?? fallbackRect?.y ?? 0,
146
+ width: width ?? fallbackRect?.width ?? 0,
147
+ height: height ?? fallbackRect?.height ?? 0
148
+ };
149
+ layoutRef.current = measuredRect;
150
+ registerRect(measuredRect);
151
+ });
152
+ return;
153
+ }
154
+ if (webNode?.measureInWindow) {
155
+ webNode.measureInWindow((x, y, width, height) => {
156
+ const measuredRect = {
157
+ x: x ?? fallbackRect?.x ?? 0,
158
+ y: y ?? fallbackRect?.y ?? 0,
159
+ width: width ?? fallbackRect?.width ?? 0,
160
+ height: height ?? fallbackRect?.height ?? 0
161
+ };
162
+ layoutRef.current = measuredRect;
163
+ registerRect(measuredRect);
164
+ });
165
+ return;
166
+ }
167
+ if (fallbackRect) {
168
+ layoutRef.current = fallbackRect;
169
+ registerRect(fallbackRect);
170
+ }
171
+ return;
172
+ }
173
+ const nativeNode = viewRef.current;
174
+ if (nativeNode?.measure) {
175
+ nativeNode.measure((_x, _y, width, height, pageX, pageY) => {
176
+ const measuredRect = {
177
+ x: pageX ?? 0,
178
+ y: pageY ?? 0,
179
+ width: width ?? fallbackRect?.width ?? 0,
180
+ height: height ?? fallbackRect?.height ?? 0
181
+ };
182
+ layoutRef.current = measuredRect;
183
+ registerRect(measuredRect);
184
+ });
185
+ return;
186
+ }
187
+ if (nativeNode?.measureInWindow) {
188
+ nativeNode.measureInWindow((x, y, width, height) => {
189
+ const measuredRect = {
190
+ x: x ?? 0,
191
+ y: y ?? 0,
192
+ width: width ?? 0,
193
+ height: height ?? 0
194
+ };
195
+ layoutRef.current = measuredRect;
196
+ registerRect(measuredRect);
197
+ });
198
+ return;
199
+ }
200
+ if (fallbackRect) {
201
+ layoutRef.current = fallbackRect;
202
+ registerRect(fallbackRect);
203
+ }
204
+ }, [registerRect]);
205
+ const updateRectFromNativeEventTarget = (0, _react.useCallback)((targetTag, fallbackRect) => {
206
+ if (_reactNative.Platform.OS === "web" || typeof targetTag !== "number") {
207
+ return;
208
+ }
209
+ const nativeUiManager = _reactNative.UIManager;
210
+ if (typeof nativeUiManager?.measure === "function") {
211
+ nativeUiManager.measure(targetTag, (x, y, width, height, pageX, pageY) => {
212
+ const measuredRect = {
213
+ x: pageX ?? x ?? fallbackRect?.x ?? 0,
214
+ y: pageY ?? y ?? fallbackRect?.y ?? 0,
215
+ width: width ?? fallbackRect?.width ?? 0,
216
+ height: height ?? fallbackRect?.height ?? 0
217
+ };
218
+ layoutRef.current = measuredRect;
219
+ registerRect(measuredRect);
220
+ });
221
+ return;
222
+ }
223
+ if (typeof nativeUiManager?.measureInWindow === "function") {
224
+ nativeUiManager.measureInWindow(targetTag, (x, y, width, height) => {
225
+ const measuredRect = {
226
+ x: x ?? fallbackRect?.x ?? 0,
227
+ y: y ?? fallbackRect?.y ?? 0,
228
+ width: width ?? fallbackRect?.width ?? 0,
229
+ height: height ?? fallbackRect?.height ?? 0
230
+ };
231
+ layoutRef.current = measuredRect;
232
+ registerRect(measuredRect);
233
+ });
234
+ }
235
+ }, [registerRect]);
236
+ const getWebEventRect = (0, _react.useCallback)(event => {
237
+ const webTarget = event.currentTarget ?? event.target ?? event.nativeEvent?.target;
238
+ if (webTarget?.getBoundingClientRect) {
239
+ const domRect = webTarget.getBoundingClientRect();
240
+ return {
241
+ x: domRect.left,
242
+ y: domRect.top,
243
+ width: domRect.width,
244
+ height: domRect.height
245
+ };
246
+ }
247
+ return undefined;
248
+ }, []);
249
+ (0, _react.useEffect)(() => {
250
+ keyRef.current = childParams[0];
251
+ if (isVisibleRef.current) {
252
+ registerRect(layoutRef.current);
253
+ }
254
+ }, [childParams, registerRect]);
255
+ (0, _react.useEffect)(() => {
256
+ // console.log(`GenieViewWrapper: ${className} ${interfaceId} created`);
257
+
258
+ // Mark as visible on mount (for native platforms where all rendered components are considered "visible")
259
+ registerRect(layoutRef.current);
260
+
261
+ // For web platform, use IntersectionObserver if available
262
+ if (_reactNative.Platform.OS === 'web' && typeof IntersectionObserver !== 'undefined') {
263
+ const observer = new IntersectionObserver(entries => {
264
+ const [entry] = entries;
265
+ const visible = entry.isIntersecting;
266
+ console.log(`GenieViewWrapper: ${className} ${interfaceId} ${visible}`);
267
+ setIsVisible(visible);
268
+ if (!visible) {
269
+ delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
270
+ return;
271
+ }
272
+ const entryRect = entry.boundingClientRect ? {
273
+ x: entry.boundingClientRect.left,
274
+ y: entry.boundingClientRect.top,
275
+ width: entry.boundingClientRect.width,
276
+ height: entry.boundingClientRect.height
277
+ } : undefined;
278
+ updateRectFromCurrentNode(layoutRef.current, entryRect);
279
+ }, {
280
+ threshold: 0.1
281
+ });
282
+
283
+ // For web, viewRef.current is the DOM node
284
+ if (viewRef.current) {
285
+ observer.observe(viewRef.current);
286
+ }
287
+ return () => {
288
+ observer.disconnect();
289
+ console.log(`GenieViewWrapper: ${className} ${interfaceId} destroyed`);
290
+ delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
291
+ };
292
+ }
293
+
294
+ // Cleanup for native platforms
295
+ return () => {
296
+ console.log(`GenieViewWrapper: ${className} ${interfaceId} destroyed`);
297
+ delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
298
+ };
299
+ }, [className, interfaceId, registerRect, updateRectFromCurrentNode]);
300
+ (0, _react.useEffect)(() => {
301
+ // Expose a live re-measure hook so tap capture can refresh cached bounds
302
+ // without forcing the wrapper to remount.
303
+ _reactDecorators.AllGenieDisplayedInstanceRefreshers[interfaceId] = () => {
304
+ if (!isVisibleRef.current) {
305
+ delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
306
+ return;
307
+ }
308
+ updateRectFromCurrentNode(layoutRef.current);
309
+ };
310
+ return () => {
311
+ delete _reactDecorators.AllGenieDisplayedInstanceRefreshers[interfaceId];
312
+ };
313
+ }, [interfaceId, updateRectFromCurrentNode]);
314
+ const handleLayout = (0, _react.useCallback)(event => {
315
+ const {
316
+ x,
317
+ y,
318
+ width,
319
+ height
320
+ } = event.nativeEvent.layout;
321
+ const newLayout = {
322
+ x,
323
+ y,
324
+ width,
325
+ height
326
+ };
327
+ setLayout(newLayout);
328
+ layoutRef.current = newLayout; // Update ref immediately
329
+
330
+ if (_reactNative.Platform.OS === "web") {
331
+ const webRect = getWebEventRect(event);
332
+ updateRectFromCurrentNode(newLayout, webRect);
333
+ return;
334
+ }
335
+ updateRectFromCurrentNode(newLayout);
336
+ updateRectFromNativeEventTarget(event.nativeEvent?.target, newLayout);
337
+ }, [getWebEventRect, updateRectFromCurrentNode, updateRectFromNativeEventTarget]);
338
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View
339
+ // @ts-ignore - ref works differently on web vs native
340
+ , {
341
+ ref: viewRef,
342
+ style: _reactNative.Platform.OS === "web" ? isScreenViewWrapper ? styles.webScreenContainer : styles.webInlineContainer : isScreenViewWrapper ? styles.nativeScreenContainer : styles.nativeInlineContainer,
343
+ onLayout: handleLayout,
344
+ collapsable: false,
345
+ testID: "genie-wrapper"
346
+ }, childComponent(...childParams));
347
+ };
348
+ exports.GenieViewWrapper = GenieViewWrapper;
349
+ const styles = _reactNative.StyleSheet.create({
350
+ webScreenContainer: {
351
+ // Screen-level wrappers on web need growth so short screens still fill the
352
+ // viewport instead of collapsing to content height.
353
+ flexGrow: 1,
354
+ flexShrink: 1,
355
+ minHeight: 0,
356
+ minWidth: 0
357
+ },
358
+ webInlineContainer: {
359
+ // Inline wrappers should remain measurable without forcing layout growth.
360
+ flexShrink: 1,
361
+ minHeight: 0,
362
+ minWidth: 0
363
+ },
364
+ nativeScreenContainer: {
365
+ // Screen-level wrappers need growth to avoid collapsing flex:1 children.
366
+ flexGrow: 1,
367
+ flexShrink: 1,
368
+ minHeight: 0,
369
+ minWidth: 0
370
+ },
371
+ nativeInlineContainer: {
372
+ // Keep inline wrappers measurable without forcing screen-level growth.
373
+ minHeight: 0,
374
+ minWidth: 0
375
+ }
376
+ });
377
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3ROYXRpdmUiLCJfcmVhY3REZWNvcmF0b3JzIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiRmFsbGJhY2tOYXZpZ2F0aW9uQ29udGV4dCIsIlJlYWN0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsIk1heWJlTmF2aWdhdGlvbkNvbnRleHQiLCJyZWFjdE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uQ29udGV4dCIsIkdlbmllVmlld1dyYXBwZXIiLCJjbGFzc05hbWUiLCJjaGlsZENvbXBvbmVudCIsImNoaWxkUGFyYW1zIiwiaW50ZXJmYWNlSWQiLCJ1c2VNZW1vIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwidmlld1JlZiIsInVzZVJlZiIsImxheW91dCIsInNldExheW91dCIsInVzZVN0YXRlIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImxheW91dFJlZiIsImlzVmlzaWJsZSIsInNldElzVmlzaWJsZSIsImlzVmlzaWJsZVJlZiIsImtleVJlZiIsIm5hdmlnYXRpb24iLCJ1c2VDb250ZXh0IiwiaXNGb2N1c2VkU2NyZWVuIiwic2V0SXNGb2N1c2VkU2NyZWVuIiwiUGxhdGZvcm0iLCJPUyIsImlzRm9jdXNlZCIsImlzU2NyZWVuVmlld1dyYXBwZXIiLCJjb21wb25lbnROYW1lIiwibmFtZSIsInRlc3QiLCJ1c2VFZmZlY3QiLCJmb2N1c1Vuc3Vic2NyaWJlIiwiYWRkTGlzdGVuZXIiLCJibHVyVW5zdWJzY3JpYmUiLCJjdXJyZW50IiwiaXNSZWN0SW5WaWV3cG9ydCIsInVzZUNhbGxiYWNrIiwicmVjdCIsInZpZXdwb3J0V2lkdGgiLCJ2aWV3cG9ydEhlaWdodCIsIndpbmRvdyIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsInZpZXdwb3J0IiwiRGltZW5zaW9ucyIsInJpZ2h0IiwiYm90dG9tIiwicmVnaXN0ZXJSZWN0IiwidmlzaWJsZSIsImhhc01lYXN1cmVkU2l6ZSIsIkFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VzIiwia2V5IiwidG9wIiwibGVmdCIsInVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUiLCJmYWxsYmFja1JlY3QiLCJwcmVmZXJyZWRSZWN0Iiwid2ViTm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRvbVJlY3QiLCJtZWFzdXJlZFJlY3QiLCJtZWFzdXJlIiwiX3giLCJfeSIsInBhZ2VYIiwicGFnZVkiLCJtZWFzdXJlSW5XaW5kb3ciLCJuYXRpdmVOb2RlIiwidXBkYXRlUmVjdEZyb21OYXRpdmVFdmVudFRhcmdldCIsInRhcmdldFRhZyIsIm5hdGl2ZVVpTWFuYWdlciIsIlVJTWFuYWdlciIsImdldFdlYkV2ZW50UmVjdCIsImV2ZW50Iiwid2ViVGFyZ2V0IiwiY3VycmVudFRhcmdldCIsInRhcmdldCIsIm5hdGl2ZUV2ZW50IiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlciIsImVudHJpZXMiLCJlbnRyeSIsImlzSW50ZXJzZWN0aW5nIiwiY29uc29sZSIsImxvZyIsImVudHJ5UmVjdCIsImJvdW5kaW5nQ2xpZW50UmVjdCIsInRocmVzaG9sZCIsIm9ic2VydmUiLCJkaXNjb25uZWN0IiwiQWxsR2VuaWVEaXNwbGF5ZWRJbnN0YW5jZVJlZnJlc2hlcnMiLCJoYW5kbGVMYXlvdXQiLCJuZXdMYXlvdXQiLCJ3ZWJSZWN0IiwiY3JlYXRlRWxlbWVudCIsIlZpZXciLCJyZWYiLCJzdHlsZSIsInN0eWxlcyIsIndlYlNjcmVlbkNvbnRhaW5lciIsIndlYklubGluZUNvbnRhaW5lciIsIm5hdGl2ZVNjcmVlbkNvbnRhaW5lciIsIm5hdGl2ZUlubGluZUNvbnRhaW5lciIsIm9uTGF5b3V0IiwiY29sbGFwc2FibGUiLCJ0ZXN0SUQiLCJleHBvcnRzIiwiU3R5bGVTaGVldCIsImNyZWF0ZSIsImZsZXhHcm93IiwiZmxleFNocmluayIsIm1pbkhlaWdodCIsIm1pbldpZHRoIl0sInNvdXJjZXMiOlsiLi4vc3JjL2dlbmllLXZpZXctd3JhcHBlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpZXcsIFBsYXRmb3JtLCBTdHlsZVNoZWV0LCBMYXlvdXRDaGFuZ2VFdmVudCwgRGltZW5zaW9ucywgVUlNYW5hZ2VyIH0gZnJvbSBcInJlYWN0LW5hdGl2ZVwiO1xuaW1wb3J0IHtcbiAgQWxsR2VuaWVEaXNwbGF5ZWRJbnN0YW5jZVJlZnJlc2hlcnMsXG4gIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VzLFxufSBmcm9tIFwiLi9yZWFjdC1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IEZhbGxiYWNrTmF2aWdhdGlvbkNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PGFueT4odW5kZWZpbmVkKTtcbmxldCBNYXliZU5hdmlnYXRpb25Db250ZXh0OiBSZWFjdC5Db250ZXh0PGFueT4gPSBGYWxsYmFja05hdmlnYXRpb25Db250ZXh0O1xuXG50cnkge1xuICBjb25zdCByZWFjdE5hdmlnYXRpb24gPSByZXF1aXJlKFwiQHJlYWN0LW5hdmlnYXRpb24vbmF0aXZlXCIpO1xuICBpZiAocmVhY3ROYXZpZ2F0aW9uPy5OYXZpZ2F0aW9uQ29udGV4dCkge1xuICAgIE1heWJlTmF2aWdhdGlvbkNvbnRleHQgPSByZWFjdE5hdmlnYXRpb24uTmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cbn0gY2F0Y2gge1xuICBNYXliZU5hdmlnYXRpb25Db250ZXh0ID0gRmFsbGJhY2tOYXZpZ2F0aW9uQ29udGV4dDtcbn1cblxuLyoqXG4gKiBDcm9zcy1wbGF0Zm9ybSBHZW5pZVZpZXdXcmFwcGVyIHVzaW5nIFJlYWN0IE5hdGl2ZSBwcmltaXRpdmVzLlxuICogV29ya3Mgb24gd2ViLCBpT1MsIGFuZCBBbmRyb2lkLlxuICogXG4gKiBVc2VzOlxuICogLSBWaWV3IGluc3RlYWQgb2YgZGl2XG4gKiAtIG9uTGF5b3V0IGZvciB0cmFja2luZyBjb21wb25lbnQgYm91bmRzXG4gKiAtIFBsYXRmb3JtLXNwZWNpZmljIHZpc2liaWxpdHkgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVZpZXdXcmFwcGVyID1cbiAgKGNsYXNzTmFtZTogc3RyaW5nLCBjaGlsZENvbXBvbmVudDogYW55LCBjaGlsZFBhcmFtczogYW55W10pID0+ICgpID0+IHtcbiAgICBjb25zdCBpbnRlcmZhY2VJZCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KSArXG4gICAgICBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpLFxuICAgICAgW10sXG4gICAgKTtcbiAgICBcbiAgICBjb25zdCB2aWV3UmVmID0gdXNlUmVmPGFueT4obnVsbCk7XG4gICAgY29uc3QgW2xheW91dCwgc2V0TGF5b3V0XSA9IHVzZVN0YXRlKHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTtcbiAgICBjb25zdCBsYXlvdXRSZWYgPSB1c2VSZWYobGF5b3V0KTtcbiAgICBjb25zdCBbaXNWaXNpYmxlLCBzZXRJc1Zpc2libGVdID0gdXNlU3RhdGUodHJ1ZSk7IC8vIEFzc3VtZSB2aXNpYmxlIG9uIG5hdGl2ZVxuICAgIGNvbnN0IGlzVmlzaWJsZVJlZiA9IHVzZVJlZih0cnVlKTsgLy8gS2VlcCBhIHJlZiB0byB0aGUgbGF0ZXN0IHZhbHVlXG4gICAgY29uc3Qga2V5UmVmID0gdXNlUmVmPGFueT4oY2hpbGRQYXJhbXNbMF0pO1xuICAgIGNvbnN0IG5hdmlnYXRpb24gPSBSZWFjdC51c2VDb250ZXh0KE1heWJlTmF2aWdhdGlvbkNvbnRleHQpO1xuICAgIGNvbnN0IFtpc0ZvY3VzZWRTY3JlZW4sIHNldElzRm9jdXNlZFNjcmVlbl0gPSB1c2VTdGF0ZTxib29sZWFuIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICBpZiAoUGxhdGZvcm0uT1MgPT09IFwid2ViXCIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIW5hdmlnYXRpb24gfHwgdHlwZW9mIG5hdmlnYXRpb24uaXNGb2N1c2VkICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIW5hdmlnYXRpb24uaXNGb2N1c2VkKCk7XG4gICAgfSk7XG4gICAgY29uc3QgaXNTY3JlZW5WaWV3V3JhcHBlciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNoaWxkQ29tcG9uZW50Py5uYW1lID8/IFwiXCI7XG4gICAgICByZXR1cm4gL1ZpZXckLy50ZXN0KGNvbXBvbmVudE5hbWUpO1xuICAgIH0sIFtjaGlsZENvbXBvbmVudF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChQbGF0Zm9ybS5PUyA9PT0gXCJ3ZWJcIikge1xuICAgICAgICBzZXRJc0ZvY3VzZWRTY3JlZW4odHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuYXZpZ2F0aW9uIHx8IHR5cGVvZiBuYXZpZ2F0aW9uLmlzRm9jdXNlZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHNldElzRm9jdXNlZFNjcmVlbih1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldElzRm9jdXNlZFNjcmVlbighIW5hdmlnYXRpb24uaXNGb2N1c2VkKCkpO1xuXG4gICAgICBjb25zdCBmb2N1c1Vuc3Vic2NyaWJlID1cbiAgICAgICAgdHlwZW9mIG5hdmlnYXRpb24uYWRkTGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gbmF2aWdhdGlvbi5hZGRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IHNldElzRm9jdXNlZFNjcmVlbih0cnVlKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJsdXJVbnN1YnNjcmliZSA9XG4gICAgICAgIHR5cGVvZiBuYXZpZ2F0aW9uLmFkZExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IG5hdmlnYXRpb24uYWRkTGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHNldElzRm9jdXNlZFNjcmVlbihmYWxzZSkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZvY3VzVW5zdWJzY3JpYmU/LigpO1xuICAgICAgICBibHVyVW5zdWJzY3JpYmU/LigpO1xuICAgICAgfTtcbiAgICB9LCBbbmF2aWdhdGlvbl0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlzVmlzaWJsZVJlZi5jdXJyZW50ID0gaXNWaXNpYmxlO1xuICAgIH0sIFtpc1Zpc2libGVdKTtcbiAgICBcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBsYXlvdXQ7XG4gICAgfSwgW2xheW91dF0pO1xuXG4gICAgY29uc3QgaXNSZWN0SW5WaWV3cG9ydCA9IHVzZUNhbGxiYWNrKChyZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9KSA9PiB7XG4gICAgICBpZiAocmVjdC53aWR0aCA8PSAwIHx8IHJlY3QuaGVpZ2h0IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdmlld3BvcnRXaWR0aCA9IDA7XG4gICAgICBsZXQgdmlld3BvcnRIZWlnaHQgPSAwO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIHdpbmRvdy5pbm5lcldpZHRoID09PSBcIm51bWJlclwiICYmXG4gICAgICAgIHR5cGVvZiB3aW5kb3cuaW5uZXJIZWlnaHQgPT09IFwibnVtYmVyXCJcbiAgICAgICkge1xuICAgICAgICB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBEaW1lbnNpb25zLmdldChcIndpbmRvd1wiKTtcbiAgICAgICAgdmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0LndpZHRoO1xuICAgICAgICB2aWV3cG9ydEhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmlnaHQgPSByZWN0LnggKyByZWN0LndpZHRoO1xuICAgICAgY29uc3QgYm90dG9tID0gcmVjdC55ICsgcmVjdC5oZWlnaHQ7XG4gICAgICByZXR1cm4gcmlnaHQgPiAwICYmIGJvdHRvbSA+IDAgJiYgcmVjdC54IDwgdmlld3BvcnRXaWR0aCAmJiByZWN0LnkgPCB2aWV3cG9ydEhlaWdodDtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCByZWdpc3RlclJlY3QgPSB1c2VDYWxsYmFjayhcbiAgICAgIChyZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LCB2aXNpYmxlID0gaXNWaXNpYmxlUmVmLmN1cnJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaGFzTWVhc3VyZWRTaXplID0gcmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwO1xuICAgICAgICBpZiAoIXZpc2libGUgfHwgKGhhc01lYXN1cmVkU2l6ZSAmJiAhaXNSZWN0SW5WaWV3cG9ydChyZWN0KSkpIHtcbiAgICAgICAgICBkZWxldGUgQWxsR2VuaWVEaXNwbGF5ZWRJbnN0YW5jZXNbaW50ZXJmYWNlSWRdO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VzW2ludGVyZmFjZUlkXSA9ICgpID0+ICh7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAga2V5OiBrZXlSZWYuY3VycmVudCxcbiAgICAgICAgICBpc0ZvY3VzZWRTY3JlZW4sXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgeDogcmVjdC54LFxuICAgICAgICAgICAgeTogcmVjdC55LFxuICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgdG9wOiByZWN0LnksXG4gICAgICAgICAgICBsZWZ0OiByZWN0LngsXG4gICAgICAgICAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgW2NsYXNzTmFtZSwgaW50ZXJmYWNlSWQsIGlzRm9jdXNlZFNjcmVlbiwgaXNSZWN0SW5WaWV3cG9ydF0sXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUgPSB1c2VDYWxsYmFjayhcbiAgICAgIChcbiAgICAgICAgZmFsbGJhY2tSZWN0PzogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICAgICAgcHJlZmVycmVkUmVjdD86IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKFBsYXRmb3JtLk9TID09PSBcIndlYlwiKSB7XG4gICAgICAgICAgaWYgKHByZWZlcnJlZFJlY3QpIHtcbiAgICAgICAgICAgIGxheW91dFJlZi5jdXJyZW50ID0gcHJlZmVycmVkUmVjdDtcbiAgICAgICAgICAgIHJlZ2lzdGVyUmVjdChwcmVmZXJyZWRSZWN0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB3ZWJOb2RlID0gdmlld1JlZi5jdXJyZW50IGFzIGFueTtcbiAgICAgICAgICBpZiAod2ViTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBkb21SZWN0ID0gd2ViTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgeDogZG9tUmVjdC5sZWZ0LFxuICAgICAgICAgICAgICB5OiBkb21SZWN0LnRvcCxcbiAgICAgICAgICAgICAgd2lkdGg6IGRvbVJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogZG9tUmVjdC5oZWlnaHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBtZWFzdXJlZFJlY3Q7XG4gICAgICAgICAgICByZWdpc3RlclJlY3QobWVhc3VyZWRSZWN0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod2ViTm9kZT8ubWVhc3VyZSkge1xuICAgICAgICAgICAgd2ViTm9kZS5tZWFzdXJlKFxuICAgICAgICAgICAgICAoX3g6IG51bWJlciwgX3k6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHBhZ2VYOiBudW1iZXIsIHBhZ2VZOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlZFJlY3QgPSB7XG4gICAgICAgICAgICAgICAgICB4OiBwYWdlWCA/PyBmYWxsYmFja1JlY3Q/LnggPz8gMCxcbiAgICAgICAgICAgICAgICAgIHk6IHBhZ2VZID8/IGZhbGxiYWNrUmVjdD8ueSA/PyAwLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoID8/IGZhbGxiYWNrUmVjdD8ud2lkdGggPz8gMCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0ID8/IGZhbGxiYWNrUmVjdD8uaGVpZ2h0ID8/IDAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG1lYXN1cmVkUmVjdDtcbiAgICAgICAgICAgICAgICByZWdpc3RlclJlY3QobWVhc3VyZWRSZWN0KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdlYk5vZGU/Lm1lYXN1cmVJbldpbmRvdykge1xuICAgICAgICAgICAgd2ViTm9kZS5tZWFzdXJlSW5XaW5kb3coKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlZFJlY3QgPSB7XG4gICAgICAgICAgICAgICAgeDogeCA/PyBmYWxsYmFja1JlY3Q/LnggPz8gMCxcbiAgICAgICAgICAgICAgICB5OiB5ID8/IGZhbGxiYWNrUmVjdD8ueSA/PyAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA/PyBmYWxsYmFja1JlY3Q/LndpZHRoID8/IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgPz8gZmFsbGJhY2tSZWN0Py5oZWlnaHQgPz8gMCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBtZWFzdXJlZFJlY3Q7XG4gICAgICAgICAgICAgIHJlZ2lzdGVyUmVjdChtZWFzdXJlZFJlY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZhbGxiYWNrUmVjdCkge1xuICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBmYWxsYmFja1JlY3Q7XG4gICAgICAgICAgICByZWdpc3RlclJlY3QoZmFsbGJhY2tSZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmF0aXZlTm9kZSA9IHZpZXdSZWYuY3VycmVudCBhcyBhbnk7XG4gICAgICAgIGlmIChuYXRpdmVOb2RlPy5tZWFzdXJlKSB7XG4gICAgICAgICAgbmF0aXZlTm9kZS5tZWFzdXJlKFxuICAgICAgICAgICAgKF94OiBudW1iZXIsIF95OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBwYWdlWDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgICB4OiBwYWdlWCA/PyAwLFxuICAgICAgICAgICAgICAgIHk6IHBhZ2VZID8/IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoID8/IGZhbGxiYWNrUmVjdD8ud2lkdGggPz8gMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCA/PyBmYWxsYmFja1JlY3Q/LmhlaWdodCA/PyAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG1lYXN1cmVkUmVjdDtcbiAgICAgICAgICAgICAgcmVnaXN0ZXJSZWN0KG1lYXN1cmVkUmVjdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hdGl2ZU5vZGU/Lm1lYXN1cmVJbldpbmRvdykge1xuICAgICAgICAgIG5hdGl2ZU5vZGUubWVhc3VyZUluV2luZG93KCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgeDogeCA/PyAwLFxuICAgICAgICAgICAgICB5OiB5ID8/IDAsXG4gICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA/PyAwLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCA/PyAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxheW91dFJlZi5jdXJyZW50ID0gbWVhc3VyZWRSZWN0O1xuICAgICAgICAgICAgcmVnaXN0ZXJSZWN0KG1lYXN1cmVkUmVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZhbGxiYWNrUmVjdCkge1xuICAgICAgICAgIGxheW91dFJlZi5jdXJyZW50ID0gZmFsbGJhY2tSZWN0O1xuICAgICAgICAgIHJlZ2lzdGVyUmVjdChmYWxsYmFja1JlY3QpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW3JlZ2lzdGVyUmVjdF0sXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlY3RGcm9tTmF0aXZlRXZlbnRUYXJnZXQgPSB1c2VDYWxsYmFjayhcbiAgICAgIChcbiAgICAgICAgdGFyZ2V0VGFnOiB1bmtub3duLFxuICAgICAgICBmYWxsYmFja1JlY3Q/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChQbGF0Zm9ybS5PUyA9PT0gXCJ3ZWJcIiB8fCB0eXBlb2YgdGFyZ2V0VGFnICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmF0aXZlVWlNYW5hZ2VyID0gVUlNYW5hZ2VyIGFzIGFueTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYXRpdmVVaU1hbmFnZXI/Lm1lYXN1cmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5hdGl2ZVVpTWFuYWdlci5tZWFzdXJlKFxuICAgICAgICAgICAgdGFyZ2V0VGFnLFxuICAgICAgICAgICAgKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGFnZVg6IG51bWJlciwgcGFnZVk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlZFJlY3QgPSB7XG4gICAgICAgICAgICAgICAgeDogcGFnZVggPz8geCA/PyBmYWxsYmFja1JlY3Q/LnggPz8gMCxcbiAgICAgICAgICAgICAgICB5OiBwYWdlWSA/PyB5ID8/IGZhbGxiYWNrUmVjdD8ueSA/PyAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA/PyBmYWxsYmFja1JlY3Q/LndpZHRoID8/IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgPz8gZmFsbGJhY2tSZWN0Py5oZWlnaHQgPz8gMCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBtZWFzdXJlZFJlY3Q7XG4gICAgICAgICAgICAgIHJlZ2lzdGVyUmVjdChtZWFzdXJlZFJlY3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbmF0aXZlVWlNYW5hZ2VyPy5tZWFzdXJlSW5XaW5kb3cgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5hdGl2ZVVpTWFuYWdlci5tZWFzdXJlSW5XaW5kb3coXG4gICAgICAgICAgICB0YXJnZXRUYWcsXG4gICAgICAgICAgICAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgICB4OiB4ID8/IGZhbGxiYWNrUmVjdD8ueCA/PyAwLFxuICAgICAgICAgICAgICAgIHk6IHkgPz8gZmFsbGJhY2tSZWN0Py55ID8/IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoID8/IGZhbGxiYWNrUmVjdD8ud2lkdGggPz8gMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCA/PyBmYWxsYmFja1JlY3Q/LmhlaWdodCA/PyAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG1lYXN1cmVkUmVjdDtcbiAgICAgICAgICAgICAgcmVnaXN0ZXJSZWN0KG1lYXN1cmVkUmVjdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbcmVnaXN0ZXJSZWN0XSxcbiAgICApO1xuXG4gICAgY29uc3QgZ2V0V2ViRXZlbnRSZWN0ID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBMYXlvdXRDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgd2ViVGFyZ2V0ID1cbiAgICAgICAgKGV2ZW50IGFzIGFueSkuY3VycmVudFRhcmdldCA/P1xuICAgICAgICAoZXZlbnQgYXMgYW55KS50YXJnZXQgPz9cbiAgICAgICAgKGV2ZW50Lm5hdGl2ZUV2ZW50IGFzIGFueSk/LnRhcmdldDtcblxuICAgICAgaWYgKHdlYlRhcmdldD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgIGNvbnN0IGRvbVJlY3QgPSB3ZWJUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogZG9tUmVjdC5sZWZ0LFxuICAgICAgICAgIHk6IGRvbVJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiBkb21SZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogZG9tUmVjdC5oZWlnaHQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSwgW10pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGtleVJlZi5jdXJyZW50ID0gY2hpbGRQYXJhbXNbMF07XG4gICAgICBpZiAoaXNWaXNpYmxlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmVnaXN0ZXJSZWN0KGxheW91dFJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9LCBbY2hpbGRQYXJhbXMsIHJlZ2lzdGVyUmVjdF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBHZW5pZVZpZXdXcmFwcGVyOiAke2NsYXNzTmFtZX0gJHtpbnRlcmZhY2VJZH0gY3JlYXRlZGApO1xuICAgICAgXG4gICAgICAvLyBNYXJrIGFzIHZpc2libGUgb24gbW91bnQgKGZvciBuYXRpdmUgcGxhdGZvcm1zIHdoZXJlIGFsbCByZW5kZXJlZCBjb21wb25lbnRzIGFyZSBjb25zaWRlcmVkIFwidmlzaWJsZVwiKVxuICAgICAgcmVnaXN0ZXJSZWN0KGxheW91dFJlZi5jdXJyZW50KTtcbiAgICAgIFxuICAgICAgLy8gRm9yIHdlYiBwbGF0Zm9ybSwgdXNlIEludGVyc2VjdGlvbk9ic2VydmVyIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKFBsYXRmb3JtLk9TID09PSAnd2ViJyAmJiB0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgICAgIChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbZW50cnldID0gZW50cmllcztcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGUgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBgR2VuaWVWaWV3V3JhcHBlcjogJHtjbGFzc05hbWV9ICR7aW50ZXJmYWNlSWR9ICR7dmlzaWJsZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2V0SXNWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5UmVjdCA9IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHg6IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgeTogZW50cnkuYm91bmRpbmdDbGllbnRSZWN0LnRvcCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBlbnRyeS5ib3VuZGluZ0NsaWVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUobGF5b3V0UmVmLmN1cnJlbnQsIGVudHJ5UmVjdCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRocmVzaG9sZDogMC4xIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBGb3Igd2ViLCB2aWV3UmVmLmN1cnJlbnQgaXMgdGhlIERPTSBub2RlXG4gICAgICAgIGlmICh2aWV3UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHZpZXdSZWYuY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgR2VuaWVWaWV3V3JhcHBlcjogJHtjbGFzc05hbWV9ICR7aW50ZXJmYWNlSWR9IGRlc3Ryb3llZGApO1xuICAgICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgZm9yIG5hdGl2ZSBwbGF0Zm9ybXNcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBHZW5pZVZpZXdXcmFwcGVyOiAke2NsYXNzTmFtZX0gJHtpbnRlcmZhY2VJZH0gZGVzdHJveWVkYCk7XG4gICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICB9O1xuICAgIH0sIFtjbGFzc05hbWUsIGludGVyZmFjZUlkLCByZWdpc3RlclJlY3QsIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGVdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBFeHBvc2UgYSBsaXZlIHJlLW1lYXN1cmUgaG9vayBzbyB0YXAgY2FwdHVyZSBjYW4gcmVmcmVzaCBjYWNoZWQgYm91bmRzXG4gICAgICAvLyB3aXRob3V0IGZvcmNpbmcgdGhlIHdyYXBwZXIgdG8gcmVtb3VudC5cbiAgICAgIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VSZWZyZXNoZXJzW2ludGVyZmFjZUlkXSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1Zpc2libGVSZWYuY3VycmVudCkge1xuICAgICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUobGF5b3V0UmVmLmN1cnJlbnQpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGVsZXRlIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VSZWZyZXNoZXJzW2ludGVyZmFjZUlkXTtcbiAgICAgIH07XG4gICAgfSwgW2ludGVyZmFjZUlkLCB1cGRhdGVSZWN0RnJvbUN1cnJlbnROb2RlXSk7XG5cbiAgICBjb25zdCBoYW5kbGVMYXlvdXQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IExheW91dENoYW5nZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGV2ZW50Lm5hdGl2ZUV2ZW50LmxheW91dDtcbiAgICAgIGNvbnN0IG5ld0xheW91dCA9IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9O1xuICAgICAgc2V0TGF5b3V0KG5ld0xheW91dCk7XG4gICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG5ld0xheW91dDsgLy8gVXBkYXRlIHJlZiBpbW1lZGlhdGVseVxuXG4gICAgICBpZiAoUGxhdGZvcm0uT1MgPT09IFwid2ViXCIpIHtcbiAgICAgICAgY29uc3Qgd2ViUmVjdCA9IGdldFdlYkV2ZW50UmVjdChldmVudCk7XG4gICAgICAgIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUobmV3TGF5b3V0LCB3ZWJSZWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVSZWN0RnJvbUN1cnJlbnROb2RlKG5ld0xheW91dCk7XG4gICAgICB1cGRhdGVSZWN0RnJvbU5hdGl2ZUV2ZW50VGFyZ2V0KChldmVudC5uYXRpdmVFdmVudCBhcyBhbnkpPy50YXJnZXQsIG5ld0xheW91dCk7XG4gICAgfSwgW2dldFdlYkV2ZW50UmVjdCwgdXBkYXRlUmVjdEZyb21DdXJyZW50Tm9kZSwgdXBkYXRlUmVjdEZyb21OYXRpdmVFdmVudFRhcmdldF0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSByZWYgd29ya3MgZGlmZmVyZW50bHkgb24gd2ViIHZzIG5hdGl2ZVxuICAgICAgICByZWY9e3ZpZXdSZWZ9XG4gICAgICAgIHN0eWxlPXtcbiAgICAgICAgICBQbGF0Zm9ybS5PUyA9PT0gXCJ3ZWJcIlxuICAgICAgICAgICAgPyBpc1NjcmVlblZpZXdXcmFwcGVyXG4gICAgICAgICAgICAgID8gc3R5bGVzLndlYlNjcmVlbkNvbnRhaW5lclxuICAgICAgICAgICAgICA6IHN0eWxlcy53ZWJJbmxpbmVDb250YWluZXJcbiAgICAgICAgICAgIDogaXNTY3JlZW5WaWV3V3JhcHBlclxuICAgICAgICAgICAgICA/IHN0eWxlcy5uYXRpdmVTY3JlZW5Db250YWluZXJcbiAgICAgICAgICAgICAgOiBzdHlsZXMubmF0aXZlSW5saW5lQ29udGFpbmVyXG4gICAgICAgIH1cbiAgICAgICAgb25MYXlvdXQ9e2hhbmRsZUxheW91dH1cbiAgICAgICAgY29sbGFwc2FibGU9e2ZhbHNlfVxuICAgICAgICB0ZXN0SUQ9XCJnZW5pZS13cmFwcGVyXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkQ29tcG9uZW50KC4uLmNoaWxkUGFyYW1zKX1cbiAgICAgIDwvVmlldz5cbiAgICApO1xuICB9O1xuXG5jb25zdCBzdHlsZXMgPSBTdHlsZVNoZWV0LmNyZWF0ZSh7XG4gIHdlYlNjcmVlbkNvbnRhaW5lcjoge1xuICAgIC8vIFNjcmVlbi1sZXZlbCB3cmFwcGVycyBvbiB3ZWIgbmVlZCBncm93dGggc28gc2hvcnQgc2NyZWVucyBzdGlsbCBmaWxsIHRoZVxuICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2YgY29sbGFwc2luZyB0byBjb250ZW50IGhlaWdodC5cbiAgICBmbGV4R3JvdzogMSxcbiAgICBmbGV4U2hyaW5rOiAxLFxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtaW5XaWR0aDogMCxcbiAgfSxcbiAgd2ViSW5saW5lQ29udGFpbmVyOiB7XG4gICAgLy8gSW5saW5lIHdyYXBwZXJzIHNob3VsZCByZW1haW4gbWVhc3VyYWJsZSB3aXRob3V0IGZvcmNpbmcgbGF5b3V0IGdyb3d0aC5cbiAgICBmbGV4U2hyaW5rOiAxLFxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtaW5XaWR0aDogMCxcbiAgfSxcbiAgbmF0aXZlU2NyZWVuQ29udGFpbmVyOiB7XG4gICAgLy8gU2NyZWVuLWxldmVsIHdyYXBwZXJzIG5lZWQgZ3Jvd3RoIHRvIGF2b2lkIGNvbGxhcHNpbmcgZmxleDoxIGNoaWxkcmVuLlxuICAgIGZsZXhHcm93OiAxLFxuICAgIGZsZXhTaHJpbms6IDEsXG4gICAgbWluSGVpZ2h0OiAwLFxuICAgIG1pbldpZHRoOiAwLFxuICB9LFxuICBuYXRpdmVJbmxpbmVDb250YWluZXI6IHtcbiAgICAvLyBLZWVwIGlubGluZSB3cmFwcGVycyBtZWFzdXJhYmxlIHdpdGhvdXQgZm9yY2luZyBzY3JlZW4tbGV2ZWwgZ3Jvd3RoLlxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtaW5XaWR0aDogMCxcbiAgfSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxnQkFBQSxHQUFBRixPQUFBO0FBRzRCLFNBQUFELHdCQUFBSSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBTix1QkFBQSxZQUFBQSxDQUFBSSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENBQUFNLEdBQUEsQ0FBQVosQ0FB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