react native上拉刷新 除了在虚拟机上r+r 刷新 真机怎样刷新

ReactNative技术专栏 http://www.reactnative.pw IT技术导航网站 http://5203.pw
注意在iOS设备上运行React Native应用需要一个并且把你的设备注册为测试设备。本向导只包含React Native相关的主题。
译注:从XCode 7起,在自己的设备上调试App不再需要开发者账户了。
从设备访问开发服务器
在启用开发服务器的情况下,你可以快速的迭代修改应用,然后在设备上查看结果。这样做的前提是你的电脑和设备必须在同一个wifi环境下。
打开AwesomeApp/ios/AwesomeApp/AppDelegate.m
修改里面的URL,把localhost改为你的电脑的IP。在Mac系统下,你可以在系统设置/网络里找到电脑的IP地址。
在XCode里选中你的设备作为运行目标,然后点击&Build and Run&。
摇晃设备来打开开发菜单(重新加载、调试,等等&&)
部分出现下图提示
使用离线包
当你在真机上运行app时,所有的JavaScript代码和图片都会自动打包到App内部。这样可以脱离开发服务器运行,并最终提交到AppStore进行发布。
打开AwesomeApp/ios/AwesomeApp/AppDelegate.m
取消注释jsCodeLocation = [[NSBundle mainBundle] ...这一行。
根据你的app选择的scheme的不同,会生成不同的离线包(Debug会生成带有警告的开发模式的包,Release则会生成压缩优化过的包)。要修改scheme的话,选择Xcode顶部菜单中的Product & Scheme & Edit Scheme...,在Build Configuration选项中切换选择Debug或是Release。
禁用应用内的开发者菜单
当我们发布应用之前,你应该把应用的&Schema&设置为Release,来禁用开发者菜单。文档讲述了一些详细的操作方式。
ReactNative技术交流群
&http://www.reactnative.pw/
ReactNative中文社区 http://bbs.reactnative.pw/
阅读(...) 评论()
ReactNative技术专栏 http://www.reactnative.pw IT技术导航网站 http://5203.pw&>&&>&&>&&有关于"" 的文章列表
【腾讯Bugly干货分享】深入源码探索 ReactNative 通信机制
Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。
本文从源码角度剖析 RNA 中 Java && Js 的通信机制(基于最新的 RNA Release 20)。
对于传统 Java&&Js 通信而言,Js 调用 Java 通不外乎 Jsbridge、onprompt、log 及 addjavascriptinterface 四种方式,在 Java 调用 Js 只有 loadurl 及高版本才支持的 evaluateJavaScript 两种。但在 RN 中没有采用了传统 Java 与 Js 之间的通信机制,而是借助 MessageQueue 及模块配置表,将调用转化为{moduleID, methodID,callbackID,args},处理端在模块配置表里查找注册的模块与方法并调用。
一、Module Registry
在 RNA 中,在应用启动时根据 ReactPackage 会自动生成 NativeModuleRegistry 及 JavaScriptModuleRegistry 两份模块配置表,包含系统及自定义模块,Java 端与 Js 端持有相同的模块配置表,标识为可识别为 Native 模块或 Js 模块都是通过实现相应接口,并将实例添加 ReactPackage 的 CreactXXModules 方法即可。
CoreModulesPackage.java
public List&NativeModule& createNativeModules(
ReactApplicationContext catalystApplicationContext) {
return Arrays.&NativeModule&asList(
new AndroidInfoModule(),
new DeviceEventManagerModule(catalystApplicationContext, mHardwareBackBtnHandler),
new DebugComponentOwnershipModule(catalystApplicationContext));
public List&Class&? extends JavaScriptModule&& createJSModules() {
return Arrays.asList(
DeviceEventManagerModule.RCTDeviceEventEmitter.class,
JSTimersExecution.class,
RCTEventEmitter.class,
RCTNativeAppEventEmitter.class,
AppRegistry.class
public List&ViewManager& createViewManagers(ReactApplicationContext reactContext) {
return new ArrayList&&(0);
Js 模块 extends 自 JavascriptModule,映射在 Js 相对应 Js 模块,通过动态代理实现调用 Js 模块。下例 AppRegistry.java 为在加载完 Jsbundle 后,Native 去启动 React Application 的总入口,appkey 为应用的 ID。映射每个 JavascriptModule 的信息保存在 JavaScriptModuleRegistration 中,统一由 JavaScriptModuleRegistry 统一管理。
AppRegistry.java
public interface AppRegistry extends JavaScriptModule {
void runApplication(String appKey, WritableMap appParameters);
void unmountApplicationComponentAtRootTag(int rootNodeTag);
Java 模块 extends 自 BaseJavaModule,在 Js 层存在同名文件识别为可调用的 Native。重写 getName 识别为 Js 的模块名,重写 getConstants 识别为 Js 可访问的常量,方法通过注解 @ReactMethod 可识别供 Js 调用的 API 接口,所有 Java 层提供的模块接口统一由 NativeModuleRegistry 统一暴露。
AndroidInfoModule.java
public class AndroidInfoModule extends BaseJavaModule {
public String getName() {
return "AndroidConstants";
public @Nullable Map&String, Object& getConstants() {
HashMap&String, Object& constants = new HashMap&String, Object&();
constants.put("Version", Build.VERSION.SDK_INT);
二、Java -& Js
完整通信机制流程图:
简要说明下这5个步骤:
1.CatalystanceImpl 为 Js&&Java 通信高层封装实现类,业务模块通过 ReactInstanceManager 与 CatalystanceImpl 间接通信,调用Js暴露出来的API。
2.将来自Java层的调用拆分为 ModuleID,MethodID 及 Params,JavaScriptModuleInvocationHandler 通过动态代理方式交由 CatalystanceImpl 统一处理。
CatalystanceImpl 进一步将 ModuleID,MethodID 及 Params 转交给 ReactBridge JNI 处理。
ReactBridge 调用 C++层的调用链转发 ModuleID,MethodID 及 Params。
5.最终通过 JSCHelper 的 evaluateScript 的方法将 ModuleID,MethodID 及 Params 借助 JSC 传递给 Js 层。
整体调用关系比较清晰,下面分别借助源码说明上面整个流程。
在 Java 层 implements JavaScriptModule 这个 interface 被识别为 Js 层暴露的公共 Module,(由JS不允许的方法名称重载,所以继承自 JavaScriptModule 同样不允许方法重载)。JavaScriptModuleRegistry 负责管理所有的 JavaScriptModule,持有对 JavaScriptModuleInvocationHandler 的引用,通过 invoke 的方式,统一调度从 Java -& Js 的调用。
JavaScriptModuleInvocationHandler.java
private static class JavaScriptModuleInvocationHandler implements InvocationHandler {
private final CatalystInstanceImpl mCatalystI
private final JavaScriptModuleRegistration mModuleR
public JavaScriptModuleInvocationHandler(
CatalystInstanceImpl catalystInstance,
JavaScriptModuleRegistration moduleRegistration) {
mCatalystInstance = catalystI
mModuleRegistration = moduleR
public @Nullable Object invoke(Object proxy, Method method, Object args) throws Throwable {
String tracingName = mModuleRegistration.getTracingName(method);
mCatalystInstance.callFunction(
mModuleRegistration.getModuleId(),
mModuleRegistration.getMethodId(method),
Arguments.fromJavaArgs(args),
tracingName);
CatalystInstance 为 Java 与 Js 之前通信的高层接口,已被抽离成接口,CatalystInstanceImpl 为其基础实现类,业务侧在 ReactInstanceManager Create ReactContext 时通过 Builder 构建实例化,业务一般不直接持有 CatalystInstance 的引用,一般通过 Framework 层的 ReactInstanceManager 的实现类进行访问。持有对 JavaScriptModuleRegistry& RativeModuleRegistry 的引用。
CatalystInstanceImpl.java
public &T extends JavaScriptModule& T getJSModule(Class&T& jsInterface) {
return Assertions.assertNotNull(mJSModuleRegistry).getJavaScriptModule(jsInterface);
在 CatalystInstance 初始化时会调用 initializeBridge 初始化私有成员 ReactBridge,ReactBridge 做为 JNI 层的通信桥接对象,负责 Java&&JCS 之间的通信。在 Java 层调用 JS 会调用 JNI 的 CallFunction 的方法,通过 JSC 转接到 JS 层的模块。
CatalystInstanceImpl.java
private ReactBridge initializeBridge(
JavaScriptExecutor jsExecutor,
JavaScriptModulesConfig jsModulesConfig) {
mReactQueueConfiguration.getJSQueueThread().assertIsOnThread();
Assertions.assertCondition(mBridge = null, "initializeBridge should be called once");
Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "ReactBridgeCtor");
bridge = new ReactBridge(
jsExecutor,
new NativeModulesReactCallback(),
mReactQueueConfiguration.getNativeModulesQueueThread());
} finally {
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "setBatchedBridgeConfig");
bridge.setGlobalVariable(
"__fbBatchedBridgeConfig",
buildModulesConfigJSONProperty(mJavaRegistry, jsModulesConfig));
bridge.setGlobalVariable(
"__RCTProfileIsProfiling",
Systrace.isTracing(Systrace.TRACE_TAG_REACT_APPS) ? "true" : "false");
} finally {
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
ReactBridge.java
* All native functions are not thread safe and appropriate queues should be used
public native void loadScriptFromAssets(AssetManager assetManager, String assetName);
public native void loadScriptFromFile(@Nullable String fileName, @Nullable String sourceURL);
public native void callFunction(int moduleId, int methodId, NativeArray arguments);
public native void invokeCallback(int callbackID, NativeArray arguments);
public native void setGlobalVariable(String propertyName, String jsonEncodedArgument);
public native boolean supportsProfiling();
public native void startProfiler(String title);
public native void stopProfiler(String title, String filename);
private native void handleMemoryPressureModerate();
private native void handleMemoryPressureCritical();
Onload.cpp 为 C++ 层主要入口,涵盖类型操作,jsbundle 加载及全局变量操作等。通过 bridge.cpp 的转接到 JSExector.cpp 执行 JS。JSExector.cpp 最终将调用转发到 JSCHelper.cpp 中执行evaluateScript 的函数,从而执行 JS 的调用。
OnLoad.cpp
static void callFunction(JNIEnv* env, jobject obj, jint moduleId, jint methodId,
NativeArray::jhybridobject args) {
auto bridge = extractRefPtr&Bridge&(env, obj);
auto arguments = cthis(wrap_alias(args));
bridge-&callFunction(
(double) moduleId,
(double) methodId,
std::move(arguments-&array)
} catch (...) {
translatePendingCppExceptionToJavaException();
Bridge.cpp
void Bridge::callFunction(const double moduleId, const double methodId, const folly::dynamic& arguments) {
if (*m_destroyed) {
#ifdef WITH_FBSYSTRACE
FbSystraceSection s(TRACE_TAG_REACT_CXX_BRIDGE, "Bridge.callFunction");
auto returnedJSON = m_jsExecutor-&callFunction(moduleId, methodId, arguments);
m_callback(parseMethodCalls(returnedJSON), true /* = isEndOfBatch */);
JSCExectutor.cpp
std::string JSCExecutor::callFunction(const double moduleId, const double methodId, const folly::dynamic& arguments) {
Make this a first class function instead of evaling. #9317773
std::vector&folly::dynamic& call{
(double) moduleId,
(double) methodId,
std::move(arguments),
return executeJSCallWithJSC(m_context, "callFunctionReturnFlushedQueue", std::move(call));
JSCHelpers.cpp
JSValueRef evaluateScript(JSContextRef context, JSStringRef script, JSStringRef source, const char *cachePath) {
JSValueRef exn,
#if WITH_FBJSCEXTENSIONS
if (source){
// If evaluating an application script, send it through `JSEvaluateScriptWithCache()`
to add cache support.
result = JSEvaluateScriptWithCache(context, script, NULL, source, 0, &exn, cachePath);
result = JSEvaluateScript(context, script, NULL, source, 0, &exn);
result = JSEvaluateScript(context, script, NULL, source, 0, &exn);
if (result = nullptr) {
Value exception = Value(context, exn);
std::string exceptionText = exception.toString().str();
FBLOGE("Got JS Exception: %s", exceptionText.c_str());
auto line = exception.asObject().getProperty("line");
std::ostringstream locationI
std::string file = source != nullptr ? String::adopt(source).str() : "";
locationInfo && "(" && (file.length() ? file : "&unknown file&");
if (line != nullptr && line.isNumber()) {
locationInfo && ":" && line.asInteger();
locationInfo && ")";
throwJSExecutionException("%s %s", exceptionText.c_str(), locationInfo.str().c_str());
至此,从 Java -& C++ 层调用链结束,JSC 将执行 JS 调用,在 JS Framewrok 层接收来自 C++的调用为 MessageQueue.js 的 callFunctionReturnFlushedQueue。在调用 CallFunction 执行 Js 后,会调用 flushedQueue 更新队列。
MessageQueue.js
callFunctionReturnFlushedQueue(module, method, args) {
guard(() =& {
this.__callFunction(module, method, args);
this.__callImmediates();
return this.flushedQueue();
MessageQueue.js
__callFunction(module, method, args) {
this._lastFlush = new Date().getTime();
this._eventLoopStartTime = this._lastF
if (isFinite(module)) {
method = this._methodT
module = this._moduleT
Systrace.beginEvent(`${module}.${method}()`);
if (__DEV__ && SPY_MODE) {
console.log('N-&JS : ' + module + '.' + method + '(' + JSON.stringify(args) + ')');
var moduleMethods = this._callableM
invariant(
!!moduleMethods,
'Module %s is not a registered callable module.',
moduleMethods.apply(moduleMethods, args);
Systrace.endEvent();
三、Js -& Java
对于 JS -& Java 调用的设计相对独特,在 React Native 的设计中, JS 是不能直接调用 Java 的接口的,而是将来自 JS 层的调用 Push 到 JS 层的一个 MessageQueue 中,在事件发生时会调用 JS 相应的模块方法去处理,处理完这些事件后再执行 JS 想让 Java 执行的方法,与 native 开发里事件响应机制是一致的。
完整通信机制流程图:
简要说明下这5个步骤:
1.JS 层调用 Java 层暴露的 API。
2.将来自 JS 层的调用拆分为 ModuleID,MethodID 及 Params 分别 push 进相应的 queue 中。
3.当事件发生时,会执行从 Java -& JS 上面这条调用链路。
4.在执行完 callFunctionReturnFlushedQueue 后,会调用 flushedQueue 并返回 MessageQueue,即刷新后的队列。
5.Java 层的 JavaRegistry 根据模块配置表调用相应模块执行。
下面分别借助源码说明上面整个流程。
MessageQueue.js
__nativeCall(module, method, params, onFail, onSucc) {
if (onFail || onSucc) {
// eventually delete old debug info
(this._callbackID & (1 && 5)) &&
(this._debugInfo = null);
this._debugInfo = ;
onFail && params.push(this._callbackID);
this._callbacks = onF
onSucc && params.push(this._callbackID);
this._callbacks = onS
global.nativeTraceBeginAsyncFlow &&
global.nativeTraceBeginAsyncFlow(TRACE_TAG_REACT_APPS, 'native', this._callID);
this._callID++;
this._queue.push(module);
this._queue.push(method);
this._queue.push(params);
var now = new Date().getTime();
if (global.nativeFlushQueueImmediate &&
now - this._lastFlush &= MIN_TIME_BETWEEN_FLUSHES_MS) {
global.nativeFlushQueueImmediate(this._queue);
this._queue = , , , this._callID];
this._lastFlush =
Systrace.counterEvent('pending_js_to_native_queue', this._queue.length);
if (__DEV__ && SPY_MODE && isFinite(module)) {
console.log('JS-&N : ' + this._remoteModuleTable + '.' +
this._remoteMethodTable + '(' + JSON.stringify(params) + ')');
MessageQueue.js
callFunctionReturnFlushedQueue(module, method, args) {
guard(() =& {
this.__callFunction(module, method, args);
this.__callImmediates();
return this.flushedQueue();
invokeCallbackAndReturnFlushedQueue(cbID, args) {
guard(() =& {
this.__invokeCallback(cbID, args);
this.__callImmediates();
return this.flushedQueue();
flushedQueue() {
this.__callImmediates();
let queue = this._
this._queue = , , , this._callID];
return queue.length ? queue :
Js 层通过调用__nativeCall 将 ModuleID,MethodID 及 Params 放入不同队列。当 Java 层事件发生后会调用 Java -& Js 整个调用链,最终到 flushedQueue 并返回 MessageQueue。
Java 层收到来自 MessageQueue 的调用信息,查询 Java 层模块配置表,调用相应模块相应接口。
CatalystInstanceImpl$NativeModulesReactCallback.java
private class NativeModulesReactCallback implements ReactCallback {
public void call(int moduleId, int methodId, ReadableNativeArray parameters) {
mReactQueueConfiguration.getNativeModulesQueueThread().assertIsOnThread();
// Suppress any callbacks if destroyed - will only lead to sadness.
if (mDestroyed) {
mJavaRegistry.call(CatalystInstanceImpl.this, moduleId, methodId, parameters);
查询到相应 Java 模块,通过反射调用相应接口。
BaseJavaModule.java
public void invoke(CatalystInstance catalystInstance, ReadableNativeArray parameters) {
Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "callJavaModuleMethod");
mMethod.invoke(BaseJavaModule.this, mArguments);
} catch (IllegalArgumentException ie) {
} finally {
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
如果你觉得内容意犹未尽,如果你想了解更多相关信息,请扫描以下二维码,关注我们的公众账号,可以获取更多技术类干货,还有精彩活动与你分享~
腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!
LW1jZS1zdHlsZT0idGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ij48YSBocmVmPSJodHRwOi8v
YnVnbHkucXEuY29tLyIgdGFyZ2V0PSJodHRwOi8vYnVnbHkucXEuY29tL2Jicy9fYmxhbmsiIGRh
dGEtbWNlLWhyZWY9Imh0dHA6Ly9idWdseS5xcS5jb20vIj5CdWdseTwvYT48L3NwYW4+Jm5ic3A7
PC9zdHJvbmc+PHN0cm9uZz7mioDmnK/lubLotKfns7vliJflhoXlrrnkuLvopoHmtonlj4rnp7vl
iqjlvIDlj5HmlrnlkJHvvIzmmK/nlLEgQnVnbHkg6YKA6K+36IW+6K6v5YaF6YOo5ZCE5L2N5oqA
5pyv5aSn5ZKW77yM6YCa6L+H5pel5bi45bel5L2c57uP6aqM55qE5oC757uT5Lul5Y+K5oSf5oKf
5pKw5YaZ6ICM5oiQ77yM5YaF5a655Z2H5bGe5Y6f5Yib77yM6L2s6L296K+35qCH5piO5Ye65aSE
44CCPC9zdHJvbmc+PC9wPjxwPiMjIOOAkFJlYWN0IE5hdGl2ZSBGb3IgQW5kcm9pZOOAkSBKYXZh
Jmx0OyZndDtKcyDpgJrkv6HmnLrliLbmupDnoIHliZbmnpAgIyM8L3A+PHA+5pys5paH5LuO5rqQ
56CB6KeS5bqm5YmW5p6QIFJOQSDkuK0gSmF2YSAmbHQ7Jmd0OyBKcyDnmoTpgJrkv6HmnLrliLbv
vIjln7rkuo7mnIDmlrDnmoQgUk5BIFJlbGVhc2UgMjDvvInjgII8YnI+IDxicj7lr7nkuo7kvKDn
u58gSmF2YSZsdDsmZ3Q7SnMg6YCa5L+h6ICM6KiA77yMSnMg6LCD55SoIEphdmEg6YCa5LiN5aSW
5LmOIEpzYnJpZGdl44CBb25wcm9tcHTjgIFsb2cg5Y+KIGFkZGphdmFzY3JpcHRpbnRlcmZhY2Ug
5Zub56eN5pa55byP77yM5ZyoIEphdmEg6LCD55SoIEpzIOWPquaciSBsb2FkdXJsIOWPiumrmOeJ
iOacrOaJjeaUr+aMgeeahCBldmFsdWF0ZUphdmFTY3JpcHQg5Lik56eN44CC5L2G5ZyoIFJOIOS4
reayoeaciemHh+eUqOS6huS8oOe7nyBKYXZhIOS4jiBKcyDkuYvpl7TnmoTpgJrkv6HmnLrliLbv
vIzogIzmmK/lgJ/liqkgTWVzc2FnZVF1ZXVlIOWPiuaooeWdl+mFjee9ruihqO+8jOWwhuiwg+eU
qOi9rOWMluS4unttb2R1bGVJRCwgbWV0aG9kSUTvvIxjYWxsYmFja0lE77yMYXJnc33vvIzlpITn
kIbnq6/lnKjmqKHlnZfphY3nva7ooajph4zmn6Xmib7ms6jlhoznmoTmqKHlnZfkuI7mlrnms5Xl
ubbosIPnlKjjgII8L3A+PHA+IyMjIOS4gOOAgU1vZHVsZSBSZWdpc3RyeSAjIyM8L3A+PHA+5Zyo
IFJOQSDkuK3vvIzlnKjlupTnlKjlkK/liqjml7bmoLnmja4gUmVhY3RQYWNrYWdlIOS8muiHquWK
qOeUn+aIkCBOYXRpdmVNb2R1bGVSZWdpc3RyeSDlj4ogSmF2YVNjcmlwdE1vZHVsZVJlZ2lzdHJ5
IOS4pOS7veaooeWdl+mFjee9ruihqO+8jOWMheWQq+ezu+e7n+WPiuiHquWumuS5ieaooeWdl++8
jEphdmEg56uv5LiOIEpzIOerr+aMgeacieebuOWQjOeahOaooeWdl+mFjee9ruihqO+8jOagh+iv
huS4uuWPr+ivhuWIq+S4uiBOYXRpdmUg5qih5Z2X5oiWIEpzIOaooeWdl+mDveaYr+mAmui/h+Wu
nueOsOebuOW6lOaOpeWPo++8jOW5tuWwhuWunuS+i+a3u+WKoCBSZWFjdFBhY2thZ2Ug55qEIENy
ZWFjdFhYTW9kdWxlcyDmlrnms5XljbPlj6/jgII8L3A+PHA+ICAgIENvcmVNb2R1bGVzUGFja2Fn
ZS5qYXZhPC9wPjxwPiAgICBAT3ZlcnJpZGU8YnI+ICAgIHB1YmxpYyBMaXN0Jmx0O05hdGl2ZU1v
ZHVsZSZndDsgY3JlYXRlTmF0aXZlTW9kdWxlcyg8YnI+ICAgICAgIFJlYWN0QXBwbGljYXRpb25D
b250ZXh0IGNhdGFseXN0QXBwbGljYXRpb25Db250ZXh0KSB7PGJyPiAgICAgcmV0dXJuIEFycmF5
cy4mbHQ7TmF0aXZlTW9kdWxlJmd0O2FzTGlzdCg8YnI+ICAgICAgIG5ldyBBbmRyb2lkSW5mb01v
ZHVsZSgpLDxicj4gICAgICAgbmV3IERldmljZUV2ZW50TWFuYWdlck1vZHVsZShjYXRhbHlzdEFw
cGxpY2F0aW9uQ29udGV4dCwgbUhhcmR3YXJlQmFja0J0bkhhbmRsZXIpLDxicj4gICAgICAgbmV3
IERlYnVnQ29tcG9uZW50T3duZXJzaGlwTW9kdWxlKGNhdGFseXN0QXBwbGljYXRpb25Db250ZXh0
KSk7PGJyPiAgICB9PC9wPjxwPiAgICBAT3ZlcnJpZGU8YnI+ICAgIHB1YmxpYyBMaXN0Jmx0O0Ns
YXNzJmx0Oz8gZXh0ZW5kcyBKYXZhU2NyaXB0TW9kdWxlJmd0OyZndDsgY3JlYXRlSlNNb2R1bGVz
KCkgezxicj4gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoPGJyPiAgICAgIERldmljZUV2ZW50TWFu
YWdlck1vZHVsZS5SQ1REZXZpY2VFdmVudEVtaXR0ZXIuY2xhc3MsPGJyPiAgICAgIEpTVGltZXJz
RXhlY3V0aW9uLmNsYXNzLDxicj4gICAgICBSQ1RFdmVudEVtaXR0ZXIuY2xhc3MsPGJyPiAgICAg
IFJDVE5hdGl2ZUFwcEV2ZW50RW1pdHRlci5jbGFzcyw8YnI+ICAgICAgQXBwUmVnaXN0cnkuY2xh
c3M8YnI+ICAgIH08L3A+PHA+ICAgIEBPdmVycmlkZTxicj4gICAgcHVibGljIExpc3QmbHQ7Vmll
d01hbmFnZXImZ3Q7IGNyZWF0ZVZpZXdNYW5hZ2VycyhSZWFjdEFwcGxpY2F0aW9uQ29udGV4dCBy
ZWFjdENvbnRleHQpIHs8YnI+ICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QmbHQ7Jmd0OygwKTs8
YnI+ICAgIH08YnI+SnMg5qih5Z2XIGV4dGVuZHMg6IeqIEphdmFzY3JpcHRNb2R1bGXvvIzmmKDl
sITlnKggSnMg55u45a+55bqUIEpzIOaooeWdl++8jOmAmui/h+WKqOaAgeS7o+eQhuWunueOsOiw
g+eUqCBKcyDmqKHlnZfjgILkuIvkvosgQXBwUmVnaXN0cnkuamF2YSDkuLrlnKjliqDovb3lrowg
SnNidW5kbGUg5ZCO77yMTmF0aXZlIOWOu+WQr+WKqCBSZWFjdCBBcHBsaWNhdGlvbiDnmoTmgLvl
haXlj6PvvIxhcHBrZXkg5Li65bqU55So55qEIElE44CC5pig5bCE5q+P5LiqIEphdmFzY3JpcHRN
b2R1bGUg55qE5L+h5oGv5L+d5a2Y5ZyoIEphdmFTY3JpcHRNb2R1bGVSZWdpc3RyYXRpb24g5Lit
77yM57uf5LiA55SxIEphdmFTY3JpcHRNb2R1bGVSZWdpc3RyeSDnu5/kuIDnrqHnkIbjgII8L3A+
PHA+ICAgIEFwcFJlZ2lzdHJ5LmphdmE8YnI+ICAgIDxicj4gICAgcHVibGljIGludGVyZmFjZSBB
cHBSZWdpc3RyeSBleHRlbmRzIEphdmFTY3JpcHRNb2R1bGUgezxicj4gICAgPGJyPiAgICAgIHZv
aWQgcnVuQXBwbGljYXRpb24oU3RyaW5nIGFwcEtleSwgV3JpdGFibGVNYXAgYXBwUGFyYW1ldGVy
cyk7PGJyPiAgICAgIHZvaWQgdW5tb3VudEFwcGxpY2F0aW9uQ29tcG9uZW50QXRSb290VGFnKGlu
dCByb290Tm9kZVRhZyk7PGJyPiAgICA8YnI+ICAgIH08YnI+SmF2YSDmqKHlnZcgZXh0ZW5kcyDo
h6ogQmFzZUphdmFNb2R1bGXvvIzlnKggSnMg5bGC5a2Y5Zyo5ZCM5ZCN5paH5Lu26K+G5Yir5Li6
5Y+v6LCD55So55qEIE5hdGl2ZeOAgumHjeWGmSBnZXROYW1lIOivhuWIq+S4uiBKcyDnmoTmqKHl
nZflkI3vvIzph43lhpkgZ2V0Q29uc3RhbnRzIOivhuWIq+S4uiBKcyDlj6/orr/pl67nmoTluLjp
h4/vvIzmlrnms5XpgJrov4fms6jop6MgQFJlYWN0TWV0aG9kICDlj6/or4bliKvkvpsgSnMg6LCD
55So55qEIEFQSSDmjqXlj6PvvIzmiYDmnIkgSmF2YSDlsYLmj5DkvpvnmoTmqKHlnZfmjqXlj6Pn
u5/kuIDnlLEgTmF0aXZlTW9kdWxlUmVnaXN0cnkg57uf5LiA5pq06Zyy44CCPC9wPjxwPiAgICBB
bmRyb2lkSW5mb01vZHVsZS5qYXZhPC9wPjxwPiAgICBwdWJsaWMgY2xhc3MgQW5kcm9pZEluZm9N
b2R1bGUgZXh0ZW5kcyBCYXNlSmF2YU1vZHVsZSB7PC9wPjxwPiAgICAgQE92ZXJyaWRlPGJyPiAg
ICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgezxicj4gICAgICByZXR1cm4gIkFuZHJvaWRDb25z
dGFudHMiOzxicj4gICAgIH08L3A+PHA+ICAgICBAT3ZlcnJpZGU8YnI+ICAgICBwdWJsaWMgQE51
bGxhYmxlIE1hcCZsdDtTdHJpbmcsIE9iamVjdCZndDsgZ2V0Q29uc3RhbnRzKCkgezxicj4gICAg
ICAgSGFzaE1hcCZsdDtTdHJpbmcsIE9iamVjdCZndDsgY29uc3RhbnRzID0gbmV3IEhhc2hNYXAm
bHQ7U3RyaW5nLCBPYmplY3QmZ3Q7KCk7PGJyPiAgICAgICBjb25zdGFudHMucHV0KCJWZXJzaW9u
IiwgQnVpbGQuVkVSU0lPTi5TREtfSU5UKTs8YnI+ICAgICAgIHJldHVybiBjb25zdGFudHM7PGJy
PiAgICAgIH08YnI+ICAgIH08YnI+IDwvcD48cD4jIyMg5LqM44CBSmF2YSAtJmd0OyBKcyAjIyM8
L3A+PHA+5a6M5pW06YCa5L+h5py65Yi25rWB56iL5Zu+77yaPC9wPjxwPiFbYnVnbHkg5bmy6LSn
5YiG5LqrXShodHRwOi8vaS5pbWd1ci5jb20vMEVvdU11Zi5qcGcpPC9wPjxwPioq566A6KaB6K+0
5piO5LiL6L+ZNeS4quatpemqpO+8mioqPC9wPjxwPiAxLkNhdGFseXN0YW5jZUltcGwg5Li6IEpz
Jmx0OyZndDtKYXZhIOmAmuS/oemrmOWxguWwgeijheWunueOsOexu++8jOS4muWKoeaooeWdl+mA
mui/hyBSZWFjdEluc3RhbmNlTWFuYWdlciDkuI4gQ2F0YWx5c3RhbmNlSW1wbCDpl7TmjqXpgJrk
v6HvvIzosIPnlKhKc+aatOmcsuWHuuadpeeahEFQSeOAgjwvcD48cD4gMi7lsIbmnaXoh6pKYXZh
5bGC55qE6LCD55So5ouG5YiG5Li6IE1vZHVsZUlE77yMTWV0aG9kSUQg5Y+KIFBhcmFtc++8jEph
dmFTY3JpcHRNb2R1bGVJbnZvY2F0aW9uSGFuZGxlciDpgJrov4fliqjmgIHku6PnkIbmlrnlvI/k
uqTnlLEgQ2F0YWx5c3RhbmNlSW1wbCDnu5/kuIDlpITnkIbjgII8L3A+PHA+IDMuIENhdGFseXN0
YW5jZUltcGwg6L+b5LiA5q2l5bCGIE1vZHVsZUlE77yMTWV0aG9kSUQg5Y+KIFBhcmFtcyDovazk
uqTnu5kgUmVhY3RCcmlkZ2UgSk5JIOWkhOeQhuOAgjwvcD48cD4gNC4gUmVhY3RCcmlkZ2Ug6LCD
55SoIEMrK+WxgueahOiwg+eUqOmTvui9rOWPkSBNb2R1bGVJRO+8jE1ldGhvZElEIOWPiiBQYXJh
bXPjgII8L3A+PHA+IDUu5pyA57uI6YCa6L+HIEpTQ0hlbHBlciDnmoQgZXZhbHVhdGVTY3JpcHQg
55qE5pa55rOV5bCGIE1vZHVsZUlE77yMTWV0aG9kSUQg5Y+KIFBhcmFtcyDlgJ/liqkgSlNDIOS8
oOmAkue7mSBKcyDlsYLjgII8L3A+PHA+5pW05L2T6LCD55So5YWz57O75q+U6L6D5riF5pmw77yM
5LiL6Z2i5YiG5Yir5YCf5Yqp5rqQ56CB6K+05piO5LiK6Z2i5pW05Liq5rWB56iL44CCPC9wPjxw
PiDlnKggSmF2YSDlsYIgaW1wbGVtZW50cyBKYXZhU2NyaXB0TW9kdWxlIOi/meS4qiBpbnRlcmZh
Y2Ug6KKr6K+G5Yir5Li6IEpzIOWxguaatOmcsueahOWFrOWFsSBNb2R1bGXvvIwo55SxSlPkuI3l
hYHorrjnmoTmlrnms5XlkI3np7Dph43ovb3vvIzmiYDku6Xnu6fmib/oh6ogSmF2YVNjcmlwdE1v
ZHVsZSDlkIzmoLfkuI3lhYHorrjmlrnms5Xph43ovb0p44CCSmF2YVNjcmlwdE1vZHVsZVJlZ2lz
dHJ5IOi0n+i0o+euoeeQhuaJgOacieeahCBKYXZhU2NyaXB0TW9kdWxl77yM5oyB5pyJ5a+5IEph
dmFTY3JpcHRNb2R1bGVJbnZvY2F0aW9uSGFuZGxlciDnmoTlvJXnlKjvvIzpgJrov4cgaW52b2tl
IOeahOaWueW8j++8jOe7n+S4gOiwg+W6puS7jiBKYXZhIC0mZ3Q7IEpzIOeahOiwg+eUqOOAgjwv
cD48cD4gICAgSmF2YVNjcmlwdE1vZHVsZUludm9jYXRpb25IYW5kbGVyLmphdmE8L3A+PHA+ICAg
IHByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFTY3JpcHRNb2R1bGVJbnZvY2F0aW9uSGFuZGxlciBp
bXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHs8L3A+PHA+ICAgICAgcHJpdmF0ZSBmaW5hbCBD
YXRhbHlzdEluc3RhbmNlSW1wbCBtQ2F0YWx5c3RJbnN0YW5jZTs8YnI+ICAgICAgcHJpdmF0ZSBm
aW5hbCBKYXZhU2NyaXB0TW9kdWxlUmVnaXN0cmF0aW9uIG1Nb2R1bGVSZWdpc3RyYXRpb247PC9w
PjxwPiAgICAgIHB1YmxpYyBKYXZhU2NyaXB0TW9kdWxlSW52b2NhdGlvbkhhbmRsZXIoPGJyPiAg
ICAgICAgICBDYXRhbHlzdEluc3RhbmNlSW1wbCBjYXRhbHlzdEluc3RhbmNlLDxicj4gICAgICAg
ICAgSmF2YVNjcmlwdE1vZHVsZVJlZ2lzdHJhdGlvbiBtb2R1bGVSZWdpc3RyYXRpb24pIHs8YnI+
ICAgICAgICBtQ2F0YWx5c3RJbnN0YW5jZSA9IGNhdGFseXN0SW5zdGFuY2U7PGJyPiAgICAgICAg
bU1vZHVsZVJlZ2lzdHJhdGlvbiA9IG1vZHVsZVJlZ2lzdHJhdGlvbjs8YnI+ICAgICAgfTwvcD48
cD4gICAgICBAT3ZlcnJpZGU8YnI+ICAgICAgcHVibGljIEBOdWxsYWJsZSBPYmplY3QgaW52b2tl
KE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93
YWJsZSB7PGJyPiAgICAgICAgU3RyaW5nIHRyYWNpbmdOYW1lID0gbU1vZHVsZVJlZ2lzdHJhdGlv
bi5nZXRUcmFjaW5nTmFtZShtZXRob2QpOzxicj4gICAgbUNhdGFseXN0SW5zdGFuY2UuY2FsbEZ1
bmN0aW9uKDxicj4gICAgICAgICAgIG1Nb2R1bGVSZWdpc3RyYXRpb24uZ2V0TW9kdWxlSWQoKSw8
YnI+ICAgICAgICAgICBtTW9kdWxlUmVnaXN0cmF0aW9uLmdldE1ldGhvZElkKG1ldGhvZCksPGJy
PiAgICAgICAgICAgQXJndW1lbnRzLmZyb21KYXZhQXJncyhhcmdzKSw8YnI+ICAgICAgICB0cmFj
aW5nTmFtZSk7PGJyPiAgICByZXR1cm4gbnVsbDs8YnI+ICAgICB9PGJyPiAgICB9PGJyPiBDYXRh
bHlzdEluc3RhbmNlIOS4uiBKYXZhIOS4jiBKcyDkuYvliY3pgJrkv6HnmoTpq5jlsYLmjqXlj6Pv
vIzlt7Looqvmir3nprvmiJDmjqXlj6PvvIxDYXRhbHlzdEluc3RhbmNlSW1wbCDkuLrlhbbln7rn
oYDlrp7njrDnsbvvvIzkuJrliqHkvqflnKggUmVhY3RJbnN0YW5jZU1hbmFnZXIgQ3JlYXRlIFJl
YWN0Q29udGV4dCDml7bpgJrov4cgQnVpbGRlciDmnoTlu7rlrp7kvovljJbvvIzkuJrliqHkuIDo
iKzkuI3nm7TmjqXmjIHmnIkgQ2F0YWx5c3RJbnN0YW5jZSDnmoTlvJXnlKjvvIzkuIDoiKzpgJro
v4cgRnJhbWV3b3JrIOWxgueahCBSZWFjdEluc3RhbmNlTWFuYWdlciDnmoTlrp7njrDnsbvov5vo
oYzorr/pl67jgILmjIHmnInlr7kgSmF2YVNjcmlwdE1vZHVsZVJlZ2lzdHJ5JmFtcDsgUmF0aXZl
TW9kdWxlUmVnaXN0cnkg55qE5byV55So44CCPC9wPjxwPiAgICBDYXRhbHlzdEluc3RhbmNlSW1w
bC5qYXZhPC9wPjxwPiAgICBAT3ZlcnJpZGU8YnI+ICAgIHB1YmxpYyAmbHQ7VCBleHRlbmRzIEph
dmFTY3JpcHRNb2R1bGUmZ3Q7IFQgZ2V0SlNNb2R1bGUoQ2xhc3MmbHQ7VCZndDsganNJbnRlcmZh
Y2UpIHs8YnI+ICAgIHJldHVybiBBc3NlcnRpb25zLmFzc2VydE5vdE51bGwobUpTTW9kdWxlUmVn
aXN0cnkpLmdldEphdmFTY3JpcHRNb2R1bGUoanNJbnRlcmZhY2UpOzxicj4gICAgfTxicj4g5Zyo
IENhdGFseXN0SW5zdGFuY2Ug5Yid5aeL5YyW5pe25Lya6LCD55SoIGluaXRpYWxpemVCcmlkZ2Ug
5Yid5aeL5YyW56eB5pyJ5oiQ5ZGYIFJlYWN0QnJpZGdl77yMUmVhY3RCcmlkZ2Ug5YGa5Li6IEpO
SSDlsYLnmoTpgJrkv6HmoaXmjqXlr7nosaHvvIzotJ/otKMgSmF2YSZsdDsmZ3Q7SkNTIOS5i+mX
tOeahOmAmuS/oeOAguWcqCBKYXZhIOWxguiwg+eUqCBKUyDkvJrosIPnlKggSk5JIOeahCBDYWxs
RnVuY3Rpb24g55qE5pa55rOV77yM6YCa6L+HIEpTQyDovazmjqXliLAgSlMg5bGC55qE5qih5Z2X
44CCPC9wPjxwPiAgICBDYXRhbHlzdEluc3RhbmNlSW1wbC5qYXZhPC9wPjxwPiAgICBwcml2YXRl
IFJlYWN0QnJpZGdlIGluaXRpYWxpemVCcmlkZ2UoPGJyPiAgICAgICAgSmF2YVNjcmlwdEV4ZWN1
dG9yIGpzRXhlY3V0b3IsPGJyPiAgICAgICAgSmF2YVNjcmlwdE1vZHVsZXNDb25maWcganNNb2R1
bGVzQ29uZmlnKSB7PGJyPiAgICAgIG1SZWFjdFF1ZXVlQ29uZmlndXJhdGlvbi5nZXRKU1F1ZXVl
VGhyZWFkKCkuYXNzZXJ0SXNPblRocmVhZCgpOzxicj4gICAgICBBc3NlcnRpb25zLmFzc2VydENv
bmRpdGlvbihtQnJpZGdlID09IG51bGwsICJpbml0aWFsaXplQnJpZGdlIHNob3VsZCBiZSBjYWxs
ZWQgb25jZSIpOzwvcD48cD4gICAgICBTeXN0cmFjZS5iZWdpblNlY3Rpb24oU3lzdHJhY2UuVFJB
Q0VfVEFHX1JFQUNUX0pBVkFfQlJJREdFLCAiUmVhY3RCcmlkZ2VDdG9yIik7PGJyPiAgICAgIFJl
YWN0QnJpZGdlIGJyaWRnZTs8YnI+ICAgICAgdHJ5IHs8YnI+ICAgICAgICBicmlkZ2UgPSBuZXcg
UmVhY3RCcmlkZ2UoPGJyPiAgICAgICAgICAganNFeGVjdXRvciw8YnI+ICAgICAgICAgICBuZXcg
TmF0aXZlTW9kdWxlc1JlYWN0Q2FsbGJhY2soKSw8YnI+ICAgICAgICAgICBtUmVhY3RRdWV1ZUNv
bmZpZ3VyYXRpb24uZ2V0TmF0aXZlTW9kdWxlc1F1ZXVlVGhyZWFkKCkpOzxicj4gICAgfSBmaW5h
bGx5IHs8YnI+ICAgICAgU3lzdHJhY2UuZW5kU2VjdGlvbihTeXN0cmFjZS5UUkFDRV9UQUdfUkVB
Q1RfSkFWQV9CUklER0UpOzxicj4gICAgfTwvcD48cD4gICAgIFN5c3RyYWNlLmJlZ2luU2VjdGlv
bihTeXN0cmFjZS5UUkFDRV9UQUdfUkVBQ1RfSkFWQV9CUklER0UsICJzZXRCYXRjaGVkQnJpZGdl
Q29uZmlnIik7PGJyPiAgICAgdHJ5IHs8YnI+ICAgICAgIGJyaWRnZS5zZXRHbG9iYWxWYXJpYWJs
ZSg8YnI+ICAgICAgICAgICAiX19mYkJhdGNoZWRCcmlkZ2VDb25maWciLDxicj4gICAgICAgICAg
IGJ1aWxkTW9kdWxlc0NvbmZpZ0pTT05Qcm9wZXJ0eShtSmF2YVJlZ2lzdHJ5LCBqc01vZHVsZXND
b25maWcpKTs8YnI+ICAgICAgIGJyaWRnZS5zZXRHbG9iYWxWYXJpYWJsZSg8YnI+ICAgICAgICAg
ICAiX19SQ1RQcm9maWxlSXNQcm9maWxpbmciLDxicj4gICAgICAgICAgIFN5c3RyYWNlLmlzVHJh
Y2luZyhTeXN0cmFjZS5UUkFDRV9UQUdfUkVBQ1RfQVBQUykgPyAidHJ1ZSIgOiAiZmFsc2UiKTs8
YnI+ICAgICB9IGZpbmFsbHkgezxicj4gICAgICAgU3lzdHJhY2UuZW5kU2VjdGlvbihTeXN0cmFj
ZS5UUkFDRV9UQUdfUkVBQ1RfSkFWQV9CUklER0UpOzxicj4gICAgIH08L3A+PHA+ICAgICByZXR1
cm4gYnJpZGdlOzxicj4gICAgfTxicj4gICAgUmVhY3RCcmlkZ2UuamF2YTwvcD48cD4gICAgLyoq
PGJyPiAgICAqIEFsbCBuYXRpdmUgZnVuY3Rpb25zIGFyZSBub3QgdGhyZWFkIHNhZmUgYW5kIGFw
cHJvcHJpYXRlIHF1ZXVlcyBzaG91bGQgYmUgdXNlZDxicj4gICAgICovPGJyPiAgICBwdWJsaWMg
bmF0aXZlIHZvaWQgbG9hZFNjcmlwdEZyb21Bc3NldHMoQXNzZXRNYW5hZ2VyIGFzc2V0TWFuYWdl
ciwgU3RyaW5nIGFzc2V0TmFtZSk7PGJyPiAgICBwdWJsaWMgbmF0aXZlIHZvaWQgbG9hZFNjcmlw
dEZyb21GaWxlKEBOdWxsYWJsZSBTdHJpbmcgZmlsZU5hbWUsIEBOdWxsYWJsZSBTdHJpbmcgc291
cmNlVVJMKTs8YnI+ICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBjYWxsRnVuY3Rpb24oaW50IG1vZHVs
ZUlkLCBpbnQgbWV0aG9kSWQsIE5hdGl2ZUFycmF5IGFyZ3VtZW50cyk7PGJyPiAgICBwdWJsaWMg
bmF0aXZlIHZvaWQgaW52b2tlQ2FsbGJhY2soaW50IGNhbGxiYWNrSUQsIE5hdGl2ZUFycmF5IGFy
Z3VtZW50cyk7PGJyPiAgICBwdWJsaWMgbmF0aXZlIHZvaWQgc2V0R2xvYmFsVmFyaWFibGUoU3Ry
aW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGpzb25FbmNvZGVkQXJndW1lbnQpOzxicj4gICAgcHVi
bGljIG5hdGl2ZSBib29sZWFuIHN1cHBvcnRzUHJvZmlsaW5nKCk7PGJyPiAgICBwdWJsaWMgbmF0
aXZlIHZvaWQgc3RhcnRQcm9maWxlcihTdHJpbmcgdGl0bGUpOzxicj4gICAgcHVibGljIG5hdGl2
ZSB2b2lkIHN0b3BQcm9maWxlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBmaWxlbmFtZSk7PGJyPiAg
ICBwcml2YXRlIG5hdGl2ZSB2b2lkIGhhbmRsZU1lbW9yeVByZXNzdXJlTW9kZXJhdGUoKTs8YnI+
ICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgaGFuZGxlTWVtb3J5UHJlc3N1cmVDcml0aWNhbCgpOzxi
cj5PbmxvYWQuY3BwIOS4uiBDKysg5bGC5Li76KaB5YWl5Y+j77yM5ra155uW57G75Z6L5pON5L2c
77yManNidW5kbGUg5Yqg6L295Y+K5YWo5bGA5Y+Y6YeP5pON5L2c562J44CC6YCa6L+HIGJyaWRn
ZS5jcHAg55qE6L2s5o6l5YiwIEpTRXhlY3Rvci5jcHAg5omn6KGMIEpT44CCSlNFeGVjdG9yLmNw
cCDmnIDnu4jlsIbosIPnlKjovazlj5HliLAgSlNDSGVscGVyLmNwcCDkuK3miafooYxldmFsdWF0
ZVNjcmlwdCDnmoTlh73mlbDvvIzku47ogIzmiafooYwgSlMg55qE6LCD55So44CCPC9wPjxwPiAg
ICBPbkxvYWQuY3BwPC9wPjxwPiAgICBzdGF0aWMgdm9pZCBjYWxsRnVuY3Rpb24oSk5JRW52KiBl
bnYsIGpvYmplY3Qgb2JqLCBqaW50IG1vZHVsZUlkLCBqaW50IG1ldGhvZElkLDxicj4gICAgICAg
ICAgICAgICAgICAgICAgICAgTmF0aXZlQXJyYXk6OmpoeWJyaWRvYmplY3QgYXJncykgezxicj4g
ICAgICBhdXRvIGJyaWRnZSA9IGV4dHJhY3RSZWZQdHImbHQ7QnJpZGdlJmd0OyhlbnYsIG9iaik7
PGJyPiAgICAgIGF1dG8gYXJndW1lbnRzID0gY3RoaXMod3JhcF9hbGlhcyhhcmdzKSk7PGJyPiAg
ICAgIHRyeSB7PGJyPiAgICAgICBicmlkZ2UtJmd0O2NhbGxGdW5jdGlvbig8YnI+ICAgICAgICAo
ZG91YmxlKSBtb2R1bGVJZCw8YnI+ICAgICAgICAoZG91YmxlKSBtZXRob2RJZCw8YnI+ICAgICAg
ICBzdGQ6Om1vdmUoYXJndW1lbnRzLSZndDthcnJheSk8YnI+ICAgICAgICk7PGJyPiAgICAgfSBj
YXRjaCAoLi4uKSB7PGJyPiAgICAgICB0cmFuc2xhdGVQZW5kaW5nQ3BwRXhjZXB0aW9uVG9KYXZh
RXhjZXB0aW9uKCk7PGJyPiAgICAgfTxicj4gICAgQnJpZGdlLmNwcDxicj4gICAgPGJyPiAgICB2
b2lkIEJyaWRnZTo6Y2FsbEZ1bmN0aW9uKGNvbnN0IGRvdWJsZSBtb2R1bGVJZCwgY29uc3QgZG91
YmxlIG1ldGhvZElkLCBjb25zdCBmb2xseTo6ZHluYW1pYyZhbXA7IGFyZ3VtZW50cykgezxicj4g
ICAgICBpZiAoKm1fZGVzdHJveWVkKSB7PGJyPiAgICAgICAgcmV0dXJuOzxicj4gICAgIH08YnI+
ICAgICAjaWZkZWYgV0lUSF9GQlNZU1RSQUNFPGJyPiAgICAgRmJTeXN0cmFjZVNlY3Rpb24gcyhU
UkFDRV9UQUdfUkVBQ1RfQ1hYX0JSSURHRSwgIkJyaWRnZS5jYWxsRnVuY3Rpb24iKTs8YnI+ICAg
ICAjZW5kaWY8YnI+ICAgICBhdXRvIHJldHVybmVkSlNPTiA9IG1fanNFeGVjdXRvci0mZ3Q7Y2Fs
bEZ1bmN0aW9uKG1vZHVsZUlkLCBtZXRob2RJZCwgYXJndW1lbnRzKTs8YnI+ICAgICBtX2NhbGxi
YWNrKHBhcnNlTWV0aG9kQ2FsbHMocmV0dXJuZWRKU09OKSwgdHJ1ZSAvKiA9IGlzRW5kT2ZCYXRj
aCAqLyk7PGJyPiAgICB9PGJyPiAgICBKU0NFeGVjdHV0b3IuY3BwPC9wPjxwPiAgICBzdGQ6OnN0
cmluZyBKU0NFeGVjdXRvcjo6Y2FsbEZ1bmN0aW9uKGNvbnN0IGRvdWJsZSBtb2R1bGVJZCwgY29u
c3QgZG91YmxlIG1ldGhvZElkLCBjb25zdCBmb2xseTo6ZHluYW1pYyZhbXA7IGFyZ3VtZW50cykg
ezxicj4gICAgIC8vIFRPRE86ICBNYWtlIHRoaXMgYSBmaXJzdCBjbGFzcyBmdW5jdGlvbiBpbnN0
ZWFkIG9mIGV2YWxpbmcuICM5MzE3NzczPGJyPiAgICAgc3RkOjp2ZWN0b3ImbHQ7Zm9sbHk6OmR5
bmFtaWMmZ3Q7IGNhbGx7PGJyPiAgICAgICAoZG91YmxlKSBtb2R1bGVJZCw8YnI+ICAgICAgIChk
b3VibGUpIG1ldGhvZElkLDxicj4gICAgc3RkOjptb3ZlKGFyZ3VtZW50cyksPGJyPiAgICAgfTs8
YnI+ICAgICByZXR1cm4gZXhlY3V0ZUpTQ2FsbFdpdGhKU0MobV9jb250ZXh0LCAiY2FsbEZ1bmN0
aW9uUmV0dXJuRmx1c2hlZFF1ZXVlIiwgc3RkOjptb3ZlKGNhbGwpKTs8YnI+ICAgIH08YnI+ICAg
IEpTQ0hlbHBlcnMuY3BwPC9wPjxwPiAgICBKU1ZhbHVlUmVmIGV2YWx1YXRlU2NyaXB0KEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU1N0cmluZ1JlZiBzY3JpcHQsIEpTU3RyaW5nUmVmIHNvdXJjZSwg
Y29uc3QgY2hhciAqY2FjaGVQYXRoKSB7PGJyPiAgICAgICBKU1ZhbHVlUmVmIGV4biwgcmVzdWx0
Ozxicj4gICAgI2lmIFdJVEhfRkJKU0NFWFRFTlNJT05TPGJyPiAgICBpZiAoc291cmNlKXs8YnI+
ICAgICAgIC8vIElmIGV2YWx1YXRpbmcgYW4gYXBwbGljYXRpb24gc2NyaXB0LCBzZW5kIGl0IHRo
cm91Z2ggYEpTRXZhbHVhdGVTY3JpcHRXaXRoQ2FjaGUoKWA8YnI+ICAgICAgIC8vICB0byBhZGQg
Y2FjaGUgc3VwcG9ydC48YnI+ICAgICAgcmVzdWx0ID0gSlNFdmFsdWF0ZVNjcmlwdFdpdGhDYWNo
ZShjb250ZXh0LCBzY3JpcHQsIE5VTEwsIHNvdXJjZSwgMCwgJmFtcDtleG4sIGNhY2hlUGF0aCk7
PGJyPiAgICAgIH0gZWxzZSB7PGJyPiAgICAgIHJlc3VsdCA9IEpTRXZhbHVhdGVTY3JpcHQoY29u
dGV4dCwgc2NyaXB0LCBOVUxMLCBzb3VyY2UsIDAsICZhbXA7ZXhuKTs8YnI+ICAgICAgIH08YnI+
ICAgICNlbHNlPGJyPiAgICAgIHJlc3VsdCA9IEpTRXZhbHVhdGVTY3JpcHQoY29udGV4dCwgc2Ny
aXB0LCBOVUxMLCBzb3VyY2UsIDAsICZhbXA7ZXhuKTs8YnI+ICAgICNlbmRpZjxicj4gICAgICBp
ZiAocmVzdWx0ID09IG51bGxwdHIpIHs8YnI+ICAgICAgIFZhbHVlIGV4Y2VwdGlvbiA9IFZhbHVl
KGNvbnRleHQsIGV4bik7PGJyPiAgICAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25UZXh0ID0gZXhj
ZXB0aW9uLnRvU3RyaW5nKCkuc3RyKCk7PGJyPiAgICAgICBGQkxPR0UoIkdvdCBKUyBFeGNlcHRp
b246ICVzIiwgZXhjZXB0aW9uVGV4dC5jX3N0cigpKTs8YnI+ICAgICAgIGF1dG8gbGluZSA9IGV4
Y2VwdGlvbi5hc09iamVjdCgpLmdldFByb3BlcnR5KCJsaW5lIik7PC9wPjxwPiAgICAgICBzdGQ6
Om9zdHJpbmdzdHJlYW0gbG9jYXRpb25JbmZvOzxicj4gICAgICAgc3RkOjpzdHJpbmcgZmlsZSA9
IHNvdXJjZSAhPSBudWxscHRyID8gU3RyaW5nOjphZG9wdChzb3VyY2UpLnN0cigpIDogIiI7PGJy
PiAgICAgICBsb2NhdGlvbkluZm8gJmx0OyZsdDsgIigiICZsdDsmbHQ7IChmaWxlLmxlbmd0aCgp
ID8gZmlsZSA6ICImbHQ7dW5rbm93biBmaWxlJmd0OyIpOzxicj4gICAgICAgIGlmIChsaW5lICE9
IG51bGxwdHIgJmFtcDsmYW1wOyBsaW5lLmlzTnVtYmVyKCkpIHs8YnI+ICAgICAgICBsb2NhdGlv
bkluZm8gJmx0OyZsdDsgIjoiICZsdDsmbHQ7IGxpbmUuYXNJbnRlZ2VyKCk7PGJyPiAgICAgICB9
PGJyPiAgICAgICBsb2NhdGlvbkluZm8gJmx0OyZsdDsgIikiOzxicj4gICAgICAgIHRocm93SlNF
eGVjdXRpb25FeGNlcHRpb24oIiVzICVzIiwgZXhjZXB0aW9uVGV4dC5jX3N0cigpLCBsb2NhdGlv
bkluZm8uc3RyKCkuY19zdHIoKSk7PGJyPiAgICAgIH08YnI+ICAgICAgcmV0dXJuIHJlc3VsdDs8
YnI+ICAgIH08YnI+6Iez5q2k77yM5LuOIEphdmEgLSZndDsgQysrIOWxguiwg+eUqOmTvue7k+ad
n++8jEpTQyDlsIbmiafooYwgSlMg6LCD55So77yM5ZyoIEpTIEZyYW1ld3JvayDlsYLmjqXmlLbm
naXoh6ogQysr55qE6LCD55So5Li6IE1lc3NhZ2VRdWV1ZS5qcyDnmoQgY2FsbEZ1bmN0aW9uUmV0
dXJuRmx1c2hlZFF1ZXVl44CC5Zyo6LCD55SoIENhbGxGdW5jdGlvbiDmiafooYwgSnMg5ZCO77yM
5Lya6LCD55SoIGZsdXNoZWRRdWV1ZSDmm7TmlrDpmJ/liJfjgII8L3A+PHA+ICAgIE1lc3NhZ2VR
dWV1ZS5qczwvcD48cD4gICAgY2FsbEZ1bmN0aW9uUmV0dXJuRmx1c2hlZFF1ZXVlKG1vZHVsZSwg
bWV0aG9kLCBhcmdzKSB7PGJyPiAgICAgZ3VhcmQoKCkgPSZndDsgezxicj4gICAgICB0aGlzLl9f
Y2FsbEZ1bmN0aW9uKG1vZHVsZSwgbWV0aG9kLCBhcmdzKTs8YnI+ICAgICAgdGhpcy5fX2NhbGxJ
bW1lZGlhdGVzKCk7PGJyPiAgICAgfSk7PC9wPjxwPiAgICAgcmV0dXJuIHRoaXMuZmx1c2hlZFF1
ZXVlKCk7PGJyPiAgICB9PGJyPiAgICBNZXNzYWdlUXVldWUuanM8L3A+PHA+ICAgIF9fY2FsbEZ1
bmN0aW9uKG1vZHVsZSwgbWV0aG9kLCBhcmdzKSB7PGJyPiAgICAgIHRoaXMuX2xhc3RGbHVzaCA9
IG5ldyBEYXRlKCkuZ2V0VGltZSgpOzxicj4gICAgICB0aGlzLl9ldmVudExvb3BTdGFydFRpbWUg
PSB0aGlzLl9sYXN0Rmx1c2g7PGJyPiAgICAgIGlmIChpc0Zpbml0ZShtb2R1bGUpKSB7PGJyPiAg
ICAgICBtZXRob2QgPSB0aGlzLl9tZXRob2RUYWJsZVttb2R1bGVdW21ldGhvZF07PGJyPiAgICAg
ICBtb2R1bGUgPSB0aGlzLl9tb2R1bGVUYWJsZVttb2R1bGVdOzxicj4gICAgICAgfTxicj4gICAg
ICBTeXN0cmFjZS5iZWdpbkV2ZW50KGAke21vZHVsZX0uJHttZXRob2R9KClgKTs8YnI+ICAgICAg
aWYgKF9fREVWX18gJmFtcDsmYW1wOyBTUFlfTU9ERSkgezxicj4gICAgICAgIGNvbnNvbGUubG9n
KCdOLSZndDtKUyA6ICcgKyBtb2R1bGUgKyAnLicgKyBtZXRob2QgKyAnKCcgKyBKU09OLnN0cmlu
Z2lmeShhcmdzKSArICcpJyk7PGJyPiAgICAgIH08YnI+ICAgICAgdmFyIG1vZHVsZU1ldGhvZHMg
PSB0aGlzLl9jYWxsYWJsZU1vZHVsZXNbbW9kdWxlXTs8YnI+ICAgICAgaW52YXJpYW50KDxicj4g
ICAgICAgICEhbW9kdWxlTWV0aG9kcyw8YnI+ICAgICAgICAnTW9kdWxlICVzIGlzIG5vdCBhIHJl
Z2lzdGVyZWQgY2FsbGFibGUgbW9kdWxlLicsPGJyPiAgICAgICAgIG1vZHVsZTxicj4gICAgICAp
Ozxicj4gICAgICBtb2R1bGVNZXRob2RzW21ldGhvZF0uYXBwbHkobW9kdWxlTWV0aG9kcywgYXJn
cyk7PGJyPiAgICAgIFN5c3RyYWNlLmVuZEV2ZW50KCk7PGJyPiAgICB9PGJyPiA8L3A+PHA+IyMj
IOS4ieOAgUpzIC0mZ3Q7IEphdmEgIyMjPC9wPjxwPuWvueS6jiBKUyAtJmd0OyBKYXZhIOiwg+eU
qOeahOiuvuiuoeebuOWvueeLrOeJue+8jOWcqCBSZWFjdCBOYXRpdmUg55qE6K6+6K6h5Lit77yM
IEpTIOaYr+S4jeiDveebtOaOpeiwg+eUqCBKYXZhIOeahOaOpeWPo+eahO+8jOiAjOaYr+Wwhuad
peiHqiBKUyDlsYLnmoTosIPnlKggUHVzaCDliLAgSlMg5bGC55qE5LiA5LiqIE1lc3NhZ2VRdWV1
ZSDkuK3vvIzlnKjkuovku7blj5HnlJ/ml7bkvJrosIPnlKggSlMg55u45bqU55qE5qih5Z2X5pa5
5rOV5Y675aSE55CG77yM5aSE55CG5a6M6L+Z5Lqb5LqL5Lu25ZCO5YaN5omn6KGMIEpTIOaDs+iu
qSBKYXZhIOaJp+ihjOeahOaWueazle+8jOS4jiBuYXRpdmUg5byA5Y+R6YeM5LqL5Lu25ZON5bqU
5py65Yi25piv5LiA6Ie055qE44CCPC9wPjxwPuWujOaVtOmAmuS/oeacuuWItua1geeoi+Wbvu+8
mjwvcD48cD4hW0J1Z2x5IOW5sui0p+WIhuS6q10oaHR0cDovL2kuaW1ndXIuY29tL2pHbnFQQW0u
anBnKTwvcD48cD7nroDopoHor7TmmI7kuIvov5k15Liq5q2l6aqk77yaPC9wPjxwPiAxLkpTIOWx
guiwg+eUqCBKYXZhIOWxguaatOmcsueahCBBUEnjgII8L3A+PHA+IDIu5bCG5p2l6IeqIEpTIOWx
gueahOiwg+eUqOaLhuWIhuS4uiBNb2R1bGVJRO+8jE1ldGhvZElEIOWPiiBQYXJhbXMg5YiG5Yir
IHB1c2gg6L+b55u45bqU55qEIHF1ZXVlIOS4reOAgjwvcD48cD4gMy7lvZPkuovku7blj5HnlJ/m
l7bvvIzkvJrmiafooYzku44gSmF2YSAtJmd0OyBKUyDkuIrpnaLov5nmnaHosIPnlKjpk77ot6/j
gII8L3A+PHA+IDQu5Zyo5omn6KGM5a6MIGNhbGxGdW5jdGlvblJldHVybkZsdXNoZWRRdWV1ZSDl
kI7vvIzkvJrosIPnlKggZmx1c2hlZFF1ZXVlIOW5tui/lOWbniBNZXNzYWdlUXVldWXvvIzljbPl
iLfmlrDlkI7nmoTpmJ/liJfjgII8L3A+PHA+IDUuSmF2YSDlsYLnmoQgSmF2YVJlZ2lzdHJ5IOag
ueaNruaooeWdl+mFjee9ruihqOiwg+eUqOebuOW6lOaooeWdl+aJp+ihjOOAgjwvcD48cD7kuIvp
naLliIbliKvlgJ/liqnmupDnoIHor7TmmI7kuIrpnaLmlbTkuKrmtYHnqIvjgII8L3A+PHA+ICAg
IE1lc3NhZ2VRdWV1ZS5qczwvcD48cD4gICAgX19uYXRpdmVDYWxsKG1vZHVsZSwgbWV0aG9kLCBw
YXJhbXMsIG9uRmFpbCwgb25TdWNjKSB7PGJyPiAgICAgIGlmIChvbkZhaWwgfHwgb25TdWNjKSB7
PGJyPiAgICAgICAgLy8gZXZlbnR1YWxseSBkZWxldGUgb2xkIGRlYnVnIGluZm88YnI+ICAgICAg
ICh0aGlzLl9jYWxsYmFja0lEICZndDsgKDEgJmx0OyZsdDsgNSkpICZhbXA7JmFtcDs8YnI+ICAg
ICAgICAodGhpcy5fZGVidWdJbmZvW3RoaXMuX2NhbGxiYWNrSUQgJmd0OyZndDsgNV0gPSBudWxs
KTs8L3A+PHA+ICAgICAgIHRoaXMuX2RlYnVnSW5mb1t0aGlzLl9jYWxsYmFja0lEICZndDsmZ3Q7
IDFdID0gW21vZHVsZSwgbWV0aG9kXTs8YnI+ICAgICAgIG9uRmFpbCAmYW1wOyZhbXA7IHBhcmFt
cy5wdXNoKHRoaXMuX2NhbGxiYWNrSUQpOzxicj4gICAgICAgdGhpcy5fY2FsbGJhY2tzW3RoaXMu
X2NhbGxiYWNrSUQrK10gPSBvbkZhaWw7PGJyPiAgICAgICBvblN1Y2MgJmFtcDsmYW1wOyBwYXJh
bXMucHVzaCh0aGlzLl9jYWxsYmFja0lEKTs8YnI+ICAgICAgIHRoaXMuX2NhbGxiYWNrc1t0aGlz
Ll9jYWxsYmFja0lEKytdID0gb25TdWNjOzxicj4gICAgIH08L3A+PHA+ICAgICBnbG9iYWwubmF0
aXZlVHJhY2VCZWdpbkFzeW5jRmxvdyAmYW1wOyZhbXA7PGJyPiAgICAgICAgZ2xvYmFsLm5hdGl2
ZVRyYWNlQmVnaW5Bc3luY0Zsb3coVFJBQ0VfVEFHX1JFQUNUX0FQUFMsICduYXRpdmUnLCB0aGlz
Ll9jYWxsSUQpOzxicj4gICAgIHRoaXMuX2NhbGxJRCsrOzwvcD48cD4gICAgIHRoaXMuX3F1ZXVl
W01PRFVMRV9JRFNdLnB1c2gobW9kdWxlKTs8YnI+ICAgICB0aGlzLl9xdWV1ZVtNRVRIT0RfSURT
XS5wdXNoKG1ldGhvZCk7PGJyPiAgICAgdGhpcy5fcXVldWVbUEFSQU1TXS5wdXNoKHBhcmFtcyk7
PC9wPjxwPiAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOzxicj4gICAgIGlmIChn
bG9iYWwubmF0aXZlRmx1c2hRdWV1ZUltbWVkaWF0ZSAmYW1wOyZhbXA7PGJyPiAgICAgICAgIG5v
dyAtIHRoaXMuX2xhc3RGbHVzaCAmZ3Q7PSBNSU5fVElNRV9CRVRXRUVOX0ZMVVNIRVNfTVMpIHs8
YnI+ICAgICAgIGdsb2JhbC5uYXRpdmVGbHVzaFF1ZXVlSW1tZWRpYXRlKHRoaXMuX3F1ZXVlKTs8
YnI+ICAgICAgIHRoaXMuX3F1ZXVlID0gW1tdLCBbXSwgW10sIHRoaXMuX2NhbGxJRF07PGJyPiAg
ICAgICB0aGlzLl9sYXN0Rmx1c2ggPSBub3c7PGJyPiAgICAgIH08YnI+ICAgICAgU3lzdHJhY2Uu
Y291bnRlckV2ZW50KCdwZW5kaW5nX2pzX3RvX25hdGl2ZV9xdWV1ZScsIHRoaXMuX3F1ZXVlWzBd
Lmxlbmd0aCk7PGJyPiAgICAgIGlmIChfX0RFVl9fICZhbXA7JmFtcDsgU1BZX01PREUgJmFtcDsm
YW1wOyBpc0Zpbml0ZShtb2R1bGUpKSB7PGJyPiAgICAgICBjb25zb2xlLmxvZygnSlMtJmd0O04g
OiAnICsgdGhpcy5fcmVtb3RlTW9kdWxlVGFibGVbbW9kdWxlXSArICcuJyArPGJyPiAgICAgICAg
ICB0aGlzLl9yZW1vdGVNZXRob2RUYWJsZVttb2R1bGVdW21ldGhvZF0gKyAnKCcgKyBKU09OLnN0
cmluZ2lmeShwYXJhbXMpICsgJyknKTs8YnI+ICAgICB9PGJyPiAgICB9PGJyPiAgICBNZXNzYWdl
UXVldWUuanM8L3A+PHA+ICAgIGNhbGxGdW5jdGlvblJldHVybkZsdXNoZWRRdWV1ZShtb2R1bGUs
IG1ldGhvZCwgYXJncykgezxicj4gICAgICBndWFyZCgoKSA9Jmd0OyB7PGJyPiAgICAgICAgdGhp
cy5fX2NhbGxGdW5jdGlvbihtb2R1bGUsIG1ldGhvZCwgYXJncyk7PGJyPiAgICAgICAgdGhpcy5f
X2NhbGxJbW1lZGlhdGVzKCk7PGJyPiAgICAgIH0pOzwvcD48cD4gICAgICByZXR1cm4gdGhpcy5m
bHVzaGVkUXVldWUoKTs8YnI+ICAgIH08L3A+PHA+ICAgIGludm9rZUNhbGxiYWNrQW5kUmV0dXJu
Rmx1c2hlZFF1ZXVlKGNiSUQsIGFyZ3MpIHs8YnI+ICAgICAgZ3VhcmQoKCkgPSZndDsgezxicj4g
ICAgICAgIHRoaXMuX19pbnZva2VDYWxsYmFjayhjYklELCBhcmdzKTs8YnI+ICAgICAgICB0aGlz
Ll9fY2FsbEltbWVkaWF0ZXMoKTs8YnI+ICAgICAgfSk7PC9wPjxwPiAgICAgIHJldHVybiB0aGlz
LmZsdXNoZWRRdWV1ZSgpOzxicj4gICAgfTwvcD48cD4gICAgZmx1c2hlZFF1ZXVlKCkgezxicj4g
ICAgICB0aGlzLl9fY2FsbEltbWVkaWF0ZXMoKTs8L3A+PHA+ICAgICAgbGV0IHF1ZXVlID0gdGhp
cy5fcXVldWU7PGJyPiAgICAgIHRoaXMuX3F1ZXVlID0gW1tdLCBbXSwgW10sIHRoaXMuX2NhbGxJ
RF07PGJyPiAgICAgIHJldHVybiBxdWV1ZVswXS5sZW5ndGggPyBxdWV1ZSA6IG51bGw7PGJyPiAg
ICB9PGJyPkpzIOWxgumAmui/h+iwg+eUqF9fbmF0aXZlQ2FsbCDlsIYgTW9kdWxlSUTvvIxNZXRo
b2RJRCDlj4ogUGFyYW1zIOaUvuWFpeS4jeWQjOmYn+WIl+OAguW9kyBKYXZhIOWxguS6i+S7tuWP
keeUn+WQjuS8muiwg+eUqCBKYXZhIC0mZ3Q7IEpzIOaVtOS4quiwg+eUqOmTvu+8jOacgOe7iOWI
sCBmbHVzaGVkUXVldWUg5bm26L+U5ZueIE1lc3NhZ2VRdWV1ZeOAgjwvcD48cD5KYXZhIOWxguaU
tuWIsOadpeiHqiBNZXNzYWdlUXVldWUg55qE6LCD55So5L+h5oGv77yM5p+l6K+iIEphdmEg5bGC
5qih5Z2X6YWN572u6KGo77yM6LCD55So55u45bqU5qih5Z2X55u45bqU5o6l5Y+j44CCPC9wPjxw
PiAgICBDYXRhbHlzdEluc3RhbmNlSW1wbCROYXRpdmVNb2R1bGVzUmVhY3RDYWxsYmFjay5qYXZh
PC9wPjxwPiAgICBwcml2YXRlIGNsYXNzIE5hdGl2ZU1vZHVsZXNSZWFjdENhbGxiYWNrIGltcGxl
bWVudHMgUmVhY3RDYWxsYmFjayB7PC9wPjxwPiAgICAgIEBPdmVycmlkZTxicj4gICAgICBwdWJs
aWMgdm9pZCBjYWxsKGludCBtb2R1bGVJZCwgaW50IG1ldGhvZElkLCBSZWFkYWJsZU5hdGl2ZUFy
cmF5IHBhcmFtZXRlcnMpIHs8YnI+ICAgICAgIG1SZWFjdFF1ZXVlQ29uZmlndXJhdGlvbi5nZXRO
YXRpdmVNb2R1bGVzUXVldWVUaHJlYWQoKS5hc3NlcnRJc09uVGhyZWFkKCk7PC9wPjxwPiAgICAg
IC8vIFN1cHByZXNzIGFueSBjYWxsYmFja3MgaWYgZGVzdHJveWVkIC0gd2lsbCBvbmx5IGxlYWQg
dG8gc2FkbmVzcy48YnI+ICAgICAgaWYgKG1EZXN0cm95ZWQpIHs8YnI+ICAgICAgICByZXR1cm47
PGJyPiAgICAgIH08L3A+PHA+ICAgICAgbUphdmFSZWdpc3RyeS5jYWxsKENhdGFseXN0SW5zdGFu
Y2VJbXBsLnRoaXMsIG1vZHVsZUlkLCBtZXRob2RJZCwgcGFyYW1ldGVycyk7PGJyPiAgICAgIH08
YnI+ICA8YnI+ICAgIH08YnI+5p+l6K+i5Yiw55u45bqUIEphdmEg5qih5Z2X77yM6YCa6L+H5Y+N
5bCE6LCD55So55u45bqU5o6l5Y+j44CCPGJyPiAgICBCYXNlSmF2YU1vZHVsZS5qYXZhPC9wPjxw
PiAgICBAT3ZlcnJpZGU8YnI+ICAgIHB1YmxpYyB2b2lkIGludm9rZShDYXRhbHlzdEluc3RhbmNl
IGNhdGFseXN0SW5zdGFuY2UsIFJlYWRhYmxlTmF0aXZlQXJyYXkgcGFyYW1ldGVycykgezxicj4g
ICAgIFN5c3RyYWNlLmJlZ2luU2VjdGlvbihTeXN0cmFjZS5UUkFDRV9UQUdfUkVBQ1RfSkFWQV9C
UklER0UsICJjYWxsSmF2YU1vZHVsZU1ldGhvZCIpOzxicj4gICAgIHRyeSB7PGJyPiAgICAgICBt
TWV0aG9kLmludm9rZShCYXNlSmF2YU1vZHVsZS50aGlzLCBtQXJndW1lbnRzKTs8YnI+ICAgICB9
IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWUpIHs8YnI+ICAgICB9PGJyPiAgICB9
IGZpbmFsbHkgezxicj4gICAgICBTeXN0cmFjZS5lbmRTZWN0aW9uKFN5c3RyYWNlLlRSQUNFX1RB
R19SRUFDVF9KQVZBX0JSSURHRSk7PGJyPiAgICAgfTxicj4gICAgfTwvcD48cD4xMTExPC9wPg=">?

我要回帖

更多关于 react native 虚拟机 的文章

 

随机推荐