From 8a07760a8fe60d2ea30fe481015b6d4155694881 Mon Sep 17 00:00:00 2001 From: Keillion <735699921@qq.com> Date: Tue, 18 Apr 2023 10:20:29 +0800 Subject: [PATCH 1/8] refactor --- .../14.read-video-webview/android/.gitignore | 7 +- .../android/app/build.gradle | 32 +++--- .../dbrjswebview/ExampleInstrumentedTest.kt | 24 ++++ .../android/app/src/main/AndroidManifest.xml | 15 ++- .../src/main/assets/decodeBarcodeInVideo.html | 72 ++++++++++++ .../android/app/src/main/assets/index.html | 77 ------------- .../dynamsoft/dbrjswebview/MainActivity.kt | 108 ++++++++++++++++++ .../readvideowebview/MainActivity.java | 57 --------- .../app/src/main/res/layout/activity_main.xml | 13 +-- .../res/mipmap-anydpi-v33/ic_launcher.xml | 6 + .../src/main/res/mipmap-xxhdpi/logodbr.png | Bin 7685 -> 0 bytes .../app/src/main/res/values-night/themes.xml | 4 +- .../android/app/src/main/res/values/ids.xml | 4 - .../app/src/main/res/values/strings.xml | 4 +- .../app/src/main/res/values/themes.xml | 4 +- .../dynamsoft/dbrjswebview/ExampleUnitTest.kt | 17 +++ .../android/build.gradle | 26 +---- .../android/gradle.properties | 8 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 +- .../android/settings.gradle | 16 ++- 21 files changed, 292 insertions(+), 208 deletions(-) create mode 100644 1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt create mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/assets/decodeBarcodeInVideo.html delete mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/assets/index.html create mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt delete mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/javascript/readvideowebview/MainActivity.java create mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml delete mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-xxhdpi/logodbr.png delete mode 100644 1.hello-world/14.read-video-webview/android/app/src/main/res/values/ids.xml create mode 100644 1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt diff --git a/1.hello-world/14.read-video-webview/android/.gitignore b/1.hello-world/14.read-video-webview/android/.gitignore index 878c2cd5..aa724b77 100644 --- a/1.hello-world/14.read-video-webview/android/.gitignore +++ b/1.hello-world/14.read-video-webview/android/.gitignore @@ -1,7 +1,12 @@ *.iml .gradle /local.properties -.idea +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml .DS_Store /build /captures diff --git a/1.hello-world/14.read-video-webview/android/app/build.gradle b/1.hello-world/14.read-video-webview/android/app/build.gradle index 05a1ace1..33d838de 100644 --- a/1.hello-world/14.read-video-webview/android/app/build.gradle +++ b/1.hello-world/14.read-video-webview/android/app/build.gradle @@ -1,15 +1,16 @@ plugins { id 'com.android.application' + id 'org.jetbrains.kotlin.android' } android { - compileSdkVersion 30 - buildToolsVersion "30.0.2" + namespace 'com.dynamsoft.dbrjswebview' + compileSdk 33 defaultConfig { - applicationId "com.dynamsoft.javascript.readvideowebview" - minSdkVersion 21 - targetSdkVersion 30 + applicationId "com.dynamsoft.dbrjswebview" + minSdk 19 + targetSdk 33 versionCode 1 versionName "1.0" @@ -26,18 +27,19 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - repositories { - maven { - url "https://download2.dynamsoft.com/maven/aar" - } + kotlinOptions { + jvmTarget = '1.8' } } dependencies { - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.2.1' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.+' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'androidx.webkit:webkit:1.4.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' } \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt b/1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..659f32d8 --- /dev/null +++ b/1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.dynamsoft.dbrjswebview + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.dynamsoft.dbrjswebview", appContext.packageName) + } +} \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/AndroidManifest.xml b/1.hello-world/14.read-video-webview/android/app/src/main/AndroidManifest.xml index 5f3d3956..f557697e 100644 --- a/1.hello-world/14.read-video-webview/android/app/src/main/AndroidManifest.xml +++ b/1.hello-world/14.read-video-webview/android/app/src/main/AndroidManifest.xml @@ -1,16 +1,19 @@ - + + + android:theme="@style/Theme.DynamsoftBarcode" + tools:targetApi="31"> @@ -19,10 +22,6 @@ - - diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/assets/decodeBarcodeInVideo.html b/1.hello-world/14.read-video-webview/android/app/src/main/assets/decodeBarcodeInVideo.html new file mode 100644 index 00000000..56325c25 --- /dev/null +++ b/1.hello-world/14.read-video-webview/android/app/src/main/assets/decodeBarcodeInVideo.html @@ -0,0 +1,72 @@ + + + + + + + + + + Dynamsoft Barcode Reader Sample - Hello World (Decoding via Camera) + + + +Loading... + + + + + \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/assets/index.html b/1.hello-world/14.read-video-webview/android/app/src/main/assets/index.html deleted file mode 100644 index b557a2ba..00000000 --- a/1.hello-world/14.read-video-webview/android/app/src/main/assets/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - Dynamsoft Barcode Reader Sample - Read Video WebView(Android) - - - -
- -
-
-
-
- - - - - \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt b/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt new file mode 100644 index 00000000..3f4dc52f --- /dev/null +++ b/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt @@ -0,0 +1,108 @@ +package com.dynamsoft.dbrjswebview + +import android.Manifest +import android.annotation.SuppressLint +import android.content.pm.PackageManager +import android.net.Uri +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.webkit.* +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi +import androidx.core.content.ContextCompat +import androidx.webkit.WebViewAssetLoader +import androidx.webkit.WebViewClientCompat + +class MainActivity : AppCompatActivity() { + @SuppressLint("SetJavaScriptEnabled") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + val myWebView: WebView = findViewById(R.id.webview) + myWebView.settings.javaScriptEnabled = true + myWebView.settings.mediaPlaybackRequiresUserGesture = false + myWebView.settings.domStorageEnabled = true + Log.d("keillion Debug", "`myWebView.settings.cacheMode` default value: " + myWebView.settings.cacheMode.toString()) + myWebView.settings.cacheMode = WebSettings.LOAD_DEFAULT + + myWebView.webViewClient = MyWebViewClient() + myWebView.webChromeClient = MyWebChromeClient() + + myWebView.loadUrl("https://appassets.androidplatform.net/assets/decodeBarcodeInVideo.html") + } + + // Warning: If you use online url, you don't need `LocalContentWebViewClient` + // Refer: https://developer.android.com/develop/ui/views/layout/webapps/load-local-content?hl=en + private inner class MyWebViewClient : WebViewClientCompat() { + + private val assetLoader = WebViewAssetLoader.Builder() + .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this@MainActivity)) + .build() + + @RequiresApi(21) + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + return assetLoader.shouldInterceptRequest(request.url) + } + + // to support API < 21 + @Deprecated("Deprecated in Java") + override fun shouldInterceptRequest( + view: WebView, + url: String + ): WebResourceResponse? { + return assetLoader.shouldInterceptRequest(Uri.parse(url)) + } + } + + var cameraPermissionReq: PermissionRequest? = null + private inner class MyWebChromeClient : WebChromeClient() { + @RequiresApi(21) + override fun onPermissionRequest(request: PermissionRequest) { + if(request.resources.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE)){ + // Refer: https://developer.android.com/training/permissions/requesting + if(ContextCompat.checkSelfPermission( + this@MainActivity, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED){ + // You can use the API that requires the permission. + request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) + }else{ + // You can directly ask for the permission. + // The registered ActivityResultCallback gets the result of this request. + this@MainActivity.cameraPermissionReq = request + requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) + } + }else{ + request.deny() + } + } + } + + // Refer: https://developer.android.com/training/permissions/requesting + @RequiresApi(21) + val requestCameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + // Refer: https://www.dynamsoft.com/codepool/use-barcode-scanner-in-android-webview.html#set-up-webview + this@MainActivity.runOnUiThread { + if (isGranted) { + // Permission is granted. Continue the action or workflow in your + // app. + cameraPermissionReq?.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) + } else { + // Explain to the user that the feature is unavailable because the + // feature requires a permission that the user has denied. At the + // same time, respect the user's decision. Don't link to system + // settings in an effort to convince the user to change their + // decision. + cameraPermissionReq?.deny() + } + cameraPermissionReq = null + } + } +} \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/javascript/readvideowebview/MainActivity.java b/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/javascript/readvideowebview/MainActivity.java deleted file mode 100644 index 947a3220..00000000 --- a/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/javascript/readvideowebview/MainActivity.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.dynamsoft.javascript.readvideowebview; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; - -import android.annotation.SuppressLint; -import android.app.AlertDialog; -import android.os.Bundle; -import android.view.View; -import android.webkit.PermissionRequest; -import android.webkit.WebChromeClient; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import android.webkit.WebSettings; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import android.content.pm.PackageManager; - -public class MainActivity extends AppCompatActivity { - static int Camera_Permission_Request_Code = 32765; - WebView mWebView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - if (ContextCompat.checkSelfPermission(this, "android.permission.CAMERA") != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, new String[]{"android.permission.CAMERA"}, Camera_Permission_Request_Code); - } - - // Initialize WebView - mWebView = findViewById(R.id.myWebview); - WebSettings settings = mWebView.getSettings(); - settings.setJavaScriptEnabled(true); - settings.setDomStorageEnabled(true); - settings.setMediaPlaybackRequiresUserGesture(false); - - // for development, enabled debugging and clear html files cache - WebView.setWebContentsDebuggingEnabled(true); - mWebView.setWebChromeClient(new WebChromeClient() { - @Override - public void onPermissionRequest(final PermissionRequest request) { - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - request.grant(request.getResources()); - } - }); - } - }); - mWebView.setWebViewClient(new WebViewClient()); - // load local or remote web page - mWebView.loadUrl("file:///android_asset/index.html"); - } - -} \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/res/layout/activity_main.xml b/1.hello-world/14.read-video-webview/android/app/src/main/res/layout/activity_main.xml index 10a683e5..7b58479b 100644 --- a/1.hello-world/14.read-video-webview/android/app/src/main/res/layout/activity_main.xml +++ b/1.hello-world/14.read-video-webview/android/app/src/main/res/layout/activity_main.xml @@ -2,23 +2,14 @@ - - - + /> \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml b/1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-xxhdpi/logodbr.png b/1.hello-world/14.read-video-webview/android/app/src/main/res/mipmap-xxhdpi/logodbr.png deleted file mode 100644 index 45f391698d56ae117ddbce8fab9624e76577bd99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 - \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/res/values/ids.xml b/1.hello-world/14.read-video-webview/android/app/src/main/res/values/ids.xml deleted file mode 100644 index 87cd89f5..00000000 --- a/1.hello-world/14.read-video-webview/android/app/src/main/res/values/ids.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/res/values/strings.xml b/1.hello-world/14.read-video-webview/android/app/src/main/res/values/strings.xml index 9b1782d9..5d77158e 100644 --- a/1.hello-world/14.read-video-webview/android/app/src/main/res/values/strings.xml +++ b/1.hello-world/14.read-video-webview/android/app/src/main/res/values/strings.xml @@ -1,5 +1,3 @@ - ReadVideoWebView - Start - Stop + Dynamsoft Barcode \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/res/values/themes.xml b/1.hello-world/14.read-video-webview/android/app/src/main/res/values/themes.xml index c91721bc..e2ed77aa 100644 --- a/1.hello-world/14.read-video-webview/android/app/src/main/res/values/themes.xml +++ b/1.hello-world/14.read-video-webview/android/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt b/1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt new file mode 100644 index 00000000..b9a705d2 --- /dev/null +++ b/1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.dynamsoft.dbrjswebview + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/build.gradle b/1.hello-world/14.read-video-webview/android/build.gradle index 63a6b97d..ab2b874f 100644 --- a/1.hello-world/14.read-video-webview/android/build.gradle +++ b/1.hello-world/14.read-video-webview/android/build.gradle @@ -1,24 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.1.2' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir +plugins { + id 'com.android.application' version '7.4.2' apply false + id 'com.android.library' version '7.4.2' apply false + id 'org.jetbrains.kotlin.android' version '1.8.0' apply false } \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/gradle.properties b/1.hello-world/14.read-video-webview/android/gradle.properties index bf5b5032..3c5031eb 100644 --- a/1.hello-world/14.read-video-webview/android/gradle.properties +++ b/1.hello-world/14.read-video-webview/android/gradle.properties @@ -15,5 +15,9 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true \ No newline at end of file +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/gradle/wrapper/gradle-wrapper.jar b/1.hello-world/14.read-video-webview/android/gradle/wrapper/gradle-wrapper.jar index f6b961fd5a86aa5fbfe90f707c3138408be7c718..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch literal 59203 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

K7UpUK$>l@ zw`1S}(D?mUXu_C{wupRS-jiX~w=Uqqhf|Vb3Cm9L=T+w91Cu^ z*&Ty%sN?x*h~mJc4g~k{xD4ZmF%FXZNC;oVDwLZ_WvrnzY|{v8hc1nmx4^}Z;yriXsAf+Lp+OFLbR!&Ox?xABwl zu8w&|5pCxmu#$?Cv2_-Vghl2LZ6m7}VLEfR5o2Ou$x02uA-%QB2$c(c1rH3R9hesc zfpn#oqpbKuVsdfV#cv@5pV4^f_!WS+F>SV6N0JQ9E!T90EX((_{bSSFv9ld%I0&}9 zH&Jd4MEX1e0iqDtq~h?DBrxQX1iI0lIs<|kB$Yrh&cpeK0-^K%=FBsCBT46@h#yi!AyDq1V(#V}^;{{V*@T4WJ&U-NTq43w=|K>z8%pr_nC>%C(Wa_l78Ufib$r8Od)IIN=u>417 z`Hl{9A$mI5A(;+-Q&$F&h-@;NR>Z<2U;Y21>>Z;s@0V@SbkMQQj%_;~+qTuQ?c|AV zcWm3XZQHhP&R%QWarS%mJ!9R^&!_)*s(v+VR@I#QrAT}`17Y+l<`b-nvmDNW`De%y zrwTZ9EJrj1AFA>B`1jYDow}~*dfPs}IZMO3=a{Fy#IOILc8F0;JS4x(k-NSpbN@qM z`@aE_e}5{!$v3+qVs7u?sOV(y@1Os*Fgu`fCW9=G@F_#VQ%xf$hj0~wnnP0$hFI+@ zkQj~v#V>xn)u??YutKsX>pxKCl^p!C-o?+9;!Nug^ z{rP!|+KsP5%uF;ZCa5F;O^9TGac=M|=V z_H(PfkV1rz4jl?gJ(ArXMyWT4y(86d3`$iI4^l9`vLdZkzpznSd5Ikfrs8qcSy&>z zTIZgWZGXw0n9ibQxYWE@gI0(3#KA-dAdPcsL_|hg2@~C!VZDM}5;v_Nykfq!*@*Zf zE_wVgx82GMDryKO{U{D>vSzSc%B~|cjDQrt5BN=Ugpsf8H8f1lR4SGo#hCuXPL;QQ z#~b?C4MoepT3X`qdW2dNn& zo8)K}%Lpu>0tQei+{>*VGErz|qjbK#9 zvtd8rcHplw%YyQCKR{kyo6fgg!)6tHUYT(L>B7er5)41iG`j$qe*kSh$fY!PehLcD zWeKZHn<492B34*JUQh=CY1R~jT9Jt=k=jCU2=SL&&y5QI2uAG2?L8qd2U(^AW#{(x zThSy=C#>k+QMo^7caQcpU?Qn}j-`s?1vXuzG#j8(A+RUAY})F@=r&F(8nI&HspAy4 z4>(M>hI9c7?DCW8rw6|23?qQMSq?*Vx?v30U%luBo)B-k2mkL)Ljk5xUha3pK>EEj z@(;tH|M@xkuN?gsz;*bygizwYR!6=(Xgcg^>WlGtRYCozY<rFX2E>kaZo)O<^J7a`MX8Pf`gBd4vrtD|qKn&B)C&wp0O-x*@-|m*0egT=-t@%dD zgP2D+#WPptnc;_ugD6%zN}Z+X4=c61XNLb7L1gWd8;NHrBXwJ7s0ce#lWnnFUMTR& z1_R9Fin4!d17d4jpKcfh?MKRxxQk$@)*hradH2$3)nyXep5Z;B z?yX+-Bd=TqO2!11?MDtG0n(*T^!CIiF@ZQymqq1wPM_X$Iu9-P=^}v7npvvPBu!d$ z7K?@CsA8H38+zjA@{;{kG)#AHME>Ix<711_iQ@WWMObXyVO)a&^qE1GqpP47Q|_AG zP`(AD&r!V^MXQ^e+*n5~Lp9!B+#y3#f8J^5!iC@3Y@P`;FoUH{G*pj*q7MVV)29+j z>BC`a|1@U_v%%o9VH_HsSnM`jZ-&CDvbiqDg)tQEnV>b%Ptm)T|1?TrpIl)Y$LnG_ zzKi5j2Fx^K^PG1=*?GhK;$(UCF-tM~^=Z*+Wp{FSuy7iHt9#4n(sUuHK??@v+6*|10Csdnyg9hAsC5_OrSL;jVkLlf zHXIPukLqbhs~-*oa^gqgvtpgTk_7GypwH><53riYYL*M=Q@F-yEPLqQ&1Sc zZB%w}T~RO|#jFjMWcKMZccxm-SL)s_ig?OC?y_~gLFj{n8D$J_Kw%{r0oB8?@dWzn zB528d-wUBQzrrSSLq?fR!K%59Zv9J4yCQhhDGwhptpA5O5U?Hjqt>8nOD zi{)0CI|&Gu%zunGI*XFZh(ix)q${jT8wnnzbBMPYVJc4HX*9d^mz|21$=R$J$(y7V zo0dxdbX3N#=F$zjstTf*t8vL)2*{XH!+<2IJ1VVFa67|{?LP&P41h$2i2;?N~RA30LV`BsUcj zfO9#Pg1$t}7zpv#&)8`mis3~o+P(DxOMgz-V*(?wWaxi?R=NhtW}<#^Z?(BhSwyar zG|A#Q7wh4OfK<|DAcl9THc-W4*>J4nTevsD%dkj`U~wSUCh15?_N@uMdF^Kw+{agk zJ`im^wDqj`Ev)W3k3stasP`88-M0ZBs7;B6{-tSm3>I@_e-QfT?7|n0D~0RRqDb^G zyHb=is;IwuQ&ITzL4KsP@Z`b$d%B0Wuhioo1CWttW8yhsER1ZUZzA{F*K=wmi-sb#Ju+j z-l@In^IKnb{bQG}Ps>+Vu_W#grNKNGto+yjA)?>0?~X`4I3T@5G1)RqGUZuP^NJCq&^HykuYtMDD8qq+l8RcZNJsvN(10{ zQ1$XcGt}QH-U^WU!-wRR1d--{B$%vY{JLWIV%P4-KQuxxDeJaF#{eu&&r!3Qu{w}0f--8^H|KwE>)ORrcR+2Qf zb})DRcH>k0zWK8@{RX}NYvTF;E~phK{+F;MkIP$)T$93Ba2R2TvKc>`D??#mv9wg$ zd~|-`Qx5LwwsZ2hb*Rt4S9dsF%Cny5<1fscy~)d;0m2r$f=83<->c~!GNyb!U)PA; zq^!`@@)UaG)Ew(9V?5ZBq#c%dCWZrplmuM`o~TyHjAIMh0*#1{B>K4po-dx$Tk-Cq z=WZDkP5x2W&Os`N8KiYHRH#UY*n|nvd(U>yO=MFI-2BEp?x@=N<~CbLJBf6P)}vLS?xJXYJ2^<3KJUdrwKnJnTp{ zjIi|R=L7rn9b*D#Xxr4*R<3T5AuOS+#U8hNlfo&^9JO{VbH!v9^JbK=TCGR-5EWR@ zN8T-_I|&@A}(hKeL4_*eb!1G8p~&_Im8|wc>Cdir+gg90n1dw?QaXcx6Op_W1r=axRw>4;rM*UOpT#Eb9xU1IiWo@h?|5uP zka>-XW0Ikp@dIe;MN8B01a7+5V@h3WN{J=HJ*pe0uwQ3S&MyWFni47X32Q7SyCTNQ z+sR!_9IZa5!>f&V$`q!%H8ci!a|RMx5}5MA_kr+bhtQy{-^)(hCVa@I!^TV4RBi zAFa!Nsi3y37I5EK;0cqu|9MRj<^r&h1lF}u0KpKQD^5Y+LvFEwM zLU@@v4_Na#Axy6tn3P%sD^5P#<7F;sd$f4a7LBMk zGU^RZHBcxSA%kCx*eH&wgA?Qwazm8>9SCSz_!;MqY-QX<1@p$*T8lc?@`ikEqJ>#w zcG``^CoFMAhdEXT9qt47g0IZkaU)4R7wkGs^Ax}usqJ5HfDYAV$!=6?>J6+Ha1I<5 z|6=9soU4>E))tW$<#>F ziZ$6>KJf0bPfbx_)7-}tMINlc=}|H+$uX)mhC6-Hz+XZxsKd^b?RFB6et}O#+>Wmw9Ec9) z{q}XFWp{3@qmyK*Jvzpyqv57LIR;hPXKsrh{G?&dRjF%Zt5&m20Ll?OyfUYC3WRn{cgQ?^V~UAv+5 z&_m#&nIwffgX1*Z2#5^Kl4DbE#NrD&Hi4|7SPqZ}(>_+JMz=s|k77aEL}<=0Zfb)a z%F(*L3zCA<=xO)2U3B|pcTqDbBoFp>QyAEU(jMu8(jLA61-H!ucI804+B!$E^cQQa z)_ERrW3g!B9iLb3nn3dlkvD7KsY?sRvls3QC0qPi>o<)GHx%4Xb$5a3GBTJ(k@`e@ z$RUa^%S15^1oLEmA=sayrP5;9qtf!Z1*?e$ORVPsXpL{jL<6E)0sj&swP3}NPmR%FM?O>SQgN5XfHE< zo(4#Cv11(%Nnw_{_Ro}r6=gKd{k?NebJ~<~Kv0r(r0qe4n3LFx$5%x(BKvrz$m?LG zjLIc;hbj0FMdb9aH9Lpsof#yG$(0sG2%RL;d(n>;#jb!R_+dad+K;Ccw!|RY?uS(a zj~?=&M!4C(5LnlH6k%aYvz@7?xRa^2gml%vn&eKl$R_lJ+e|xsNfXzr#xuh(>`}9g zLHSyiFwK^-p!;p$yt7$F|3*IfO3Mlu9e>Dpx8O`37?fA`cj`C0B-m9uRhJjs^mRp# zWB;Aj6|G^1V6`jg7#7V9UFvnB4((nIwG?k%c7h`?0tS8J3Bn0t#pb#SA}N-|45$-j z$R>%7cc2ebAClXc(&0UtHX<>pd)akR3Kx_cK+n<}FhzmTx!8e9^u2e4%x{>T6pQ`6 zO182bh$-W5A3^wos0SV_TgPmF4WUP-+D25KjbC{y_6W_9I2_vNKwU(^qSdn&>^=*t z&uvp*@c8#2*paD!ZMCi3;K{Na;I4Q35zw$YrW5U@Kk~)&rw;G?d7Q&c9|x<Hg|CNMsxovmfth*|E*GHezPTWa^Hd^F4!B3sF;)? z(NaPyAhocu1jUe(!5Cy|dh|W2=!@fNmuNOzxi^tE_jAtzNJ0JR-avc_H|ve#KO}#S z#a(8secu|^Tx553d4r@3#6^MHbH)vmiBpn0X^29xEv!Vuh1n(Sr5I0V&`jA2;WS|Y zbf0e}X|)wA-Pf5gBZ>r4YX3Mav1kKY(ulAJ0Q*jB)YhviHK)w!TJsi3^dMa$L@^{` z_De`fF4;M87vM3Ph9SzCoCi$#Fsd38u!^0#*sPful^p5oI(xGU?yeYjn;Hq1!wzFk zG&2w}W3`AX4bxoVm03y>ts{KaDf!}b&7$(P4KAMP=vK5?1In^-YYNtx1f#}+2QK@h zeSeAI@E6Z8a?)>sZ`fbq9_snl6LCu6g>o)rO;ijp3|$vig+4t} zylEo7$SEW<_U+qgVcaVhk+4k+C9THI5V10qV*dOV6pPtAI$)QN{!JRBKh-D zk2^{j@bZ}yqW?<#VVuI_27*cI-V~sJiqQv&m07+10XF+#ZnIJdr8t`9s_EE;T2V;B z4UnQUH9EdX%zwh-5&wflY#ve!IWt0UE-My3?L#^Bh%kcgP1q{&26eXLn zTkjJ*w+(|_>Pq0v8{%nX$QZbf)tbJaLY$03;MO=Ic-uqYUmUCuXD>J>o6BCRF=xa% z3R4SK9#t1!K4I_d>tZgE>&+kZ?Q}1qo4&h%U$GfY058s%*=!kac{0Z+4Hwm!)pFLR zJ+5*OpgWUrm0FPI2ib4NPJ+Sk07j(`diti^i#kh&f}i>P4~|d?RFb#!JN)~D@)beox}bw?4VCf^y*`2{4`-@%SFTry2h z>9VBc9#JxEs1+0i2^LR@B1J`B9Ac=#FW=(?2;5;#U$0E0UNag_!jY$&2diQk_n)bT zl5Me_SUvqUjwCqmVcyb`igygB_4YUB*m$h5oeKv3uIF0sk}~es!{D>4r%PC*F~FN3owq5e0|YeUTSG#Vq%&Gk7uwW z0lDo#_wvflqHeRm*}l?}o;EILszBt|EW*zNPmq#?4A+&i0xx^?9obLyY4xx=Y9&^G;xYXYPxG)DOpPg!i_Ccl#3L}6xAAZzNhPK1XaC_~ z!A|mlo?Be*8Nn=a+FhgpOj@G7yYs(Qk(8&|h@_>w8Y^r&5nCqe0V60rRz?b5%J;GYeBqSAjo|K692GxD4` zRZyM2FdI+-jK2}WAZTZ()w_)V{n5tEb@>+JYluDozCb$fA4H)$bzg(Ux{*hXurjO^ zwAxc+UXu=&JV*E59}h3kzQPG4M)X8E*}#_&}w*KEgtX)cU{vm9b$atHa;s>| z+L6&cn8xUL*OSjx4YGjf6{Eq+Q3{!ZyhrL&^6Vz@jGbI%cAM9GkmFlamTbcQGvOlL zmJ?(FI)c86=JEs|*;?h~o)88>12nXlpMR4@yh%qdwFNpct;vMlc=;{FSo*apJ;p}! zAX~t;3tb~VuP|ZW;z$=IHf->F@Ml)&-&Bnb{iQyE#;GZ@C$PzEf6~q}4D>9jic@mTO5x76ulDz@+XAcm35!VSu zT*Gs>;f0b2TNpjU_BjHZ&S6Sqk6V1370+!eppV2H+FY!q*n=GHQ!9Rn6MjY!Jc77A zG7Y!lFp8?TIHN!LXO?gCnsYM-gQxsm=Ek**VmZu7vnuufD7K~GIxfxbsQ@qv2T zPa`tvHB$fFCyZl>3oYg?_wW)C>^_iDOc^B7klnTOoytQH18WkOk)L2BSD0r%xgRSW zQS9elF^?O=_@|58zKLK;(f77l-Zzu}4{fXed2saq!5k#UZAoDBqYQS{sn@j@Vtp|$ zG%gnZ$U|9@u#w1@11Sjl8ze^Co=)7yS(}=;68a3~g;NDe_X^}yJj;~s8xq9ahQ5_r zxAlTMnep*)w1e(TG%tWsjo3RR;yVGPEO4V{Zp?=a_0R#=V^ioQu4YL=BO4r0$$XTX zZfnw#_$V}sDAIDrezGQ+h?q24St0QNug_?{s-pI(^jg`#JRxM1YBV;a@@JQvH8*>> zIJvku74E0NlXkYe_624>znU0J@L<-c=G#F3k4A_)*;ky!C(^uZfj%WB3-*{*B$?9+ zDm$WFp=0(xnt6`vDQV3Jl5f&R(Mp};;q8d3I%Kn>Kx=^;uSVCw0L=gw53%Bp==8Sw zxtx=cs!^-_+i{2OK`Q;913+AXc_&Z5$@z3<)So0CU3;JAv=H?@Zpi~riQ{z-zLtVL z!oF<}@IgJp)Iyz1zVJ42!SPHSkjYNS4%ulVVIXdRuiZ@5Mx8LJS}J#qD^Zi_xQ@>DKDr-_e#>5h3dtje*NcwH_h;i{Sx7}dkdpuW z(yUCjckQsagv*QGMSi9u1`Z|V^}Wjf7B@q%j2DQXyd0nOyqg%m{CK_lAoKlJ7#8M} z%IvR?Vh$6aDWK2W!=i?*<77q&B8O&3?zP(Cs@kapc)&p7En?J;t-TX9abGT#H?TW? ztO5(lPKRuC7fs}zwcUKbRh=7E8wzTsa#Z{a`WR}?UZ%!HohN}d&xJ=JQhpO1PI#>X zHkb>pW04pU%Bj_mf~U}1F1=wxdBZu1790>3Dm44bQ#F=T4V3&HlOLsGH)+AK$cHk6 zia$=$kog?)07HCL*PI6}DRhpM^*%I*kHM<#1Se+AQ!!xyhcy6j7`iDX7Z-2i73_n# zas*?7LkxS-XSqv;YBa zW_n*32D(HTYQ0$feV_Fru1ZxW0g&iwqixPX3=9t4o)o|kOo79V$?$uh?#8Q8e>4e)V6;_(x&ViUVxma+i25qea;d-oK7ouuDsB^ab{ zu1qjQ%`n56VtxBE#0qAzb7lph`Eb-}TYpXB!H-}3Ykqyp`otprp7{VEuW*^IR2n$Fb99*nAtqT&oOFIf z@w*6>YvOGw@Ja?Pp1=whZqydzx@9X4n^2!n83C5{C?G@|E?&$?p*g68)kNvUTJ)I6 z1Q|(#UuP6pj78GUxq11m-GSszc+)X{C2eo-?8ud9sB=3(D47v?`JAa{V(IF zPZQ_0AY*9M97>Jf<o%#O_%Wq}8>YM=q0|tGY+hlXcpE=Z4Od z`NT7Hu2hnvRoqOw@g1f=bv`+nba{GwA$Ak0INlqI1k<9!x_!sL()h?hEWoWrdU3w` zZ%%)VR+Bc@_v!C#koM1p-3v_^L6)_Ktj4HE>aUh%2XZE@JFMOn)J~c`_7VWNb9c-N z2b|SZMR4Z@E7j&q&9(6H3yjEu6HV7{2!1t0lgizD;mZ9$r(r7W5G$ky@w(T_dFnOD z*p#+z$@pKE+>o@%eT(2-p_C}wbQ5s(%Sn_{$HDN@MB+Ev?t@3dPy`%TZ!z}AThZSu zN<1i$siJhXFdjV zP*y|V<`V8t=h#XTRUR~5`c`Z9^-`*BZf?WAehGdg)E2Je)hqFa!k{V(u+(hTf^Yq& zoruUh2(^3pe)2{bvt4&4Y9CY3js)PUHtd4rVG57}uFJL)D(JfSIo^{P=7liFXG zq5yqgof0V8paQcP!gy+;^pp-DA5pj=gbMN0eW=-eY+N8~y+G>t+x}oa!5r>tW$xhI zPQSv=pi;~653Gvf6~*JcQ%t1xOrH2l3Zy@8AoJ+wz@daW@m7?%LXkr!bw9GY@ns3e zSfuWF_gkWnesv?s3I`@}NgE2xwgs&rj?kH-FEy82=O8`+szN ziHch`vvS`zNfap14!&#i9H@wF7}yIPm=UB%(o(}F{wsZ(wA0nJ2aD^@B41>>o-_U6 zUqD~vdo48S8~FTb^+%#zcbQiiYoDKYcj&$#^;Smmb+Ljp(L=1Kt_J!;0s%1|JK}Wi z;={~oL!foo5n8=}rs6MmUW~R&;SIJO3TL4Ky?kh+b2rT9B1Jl4>#Uh-Bec z`Hsp<==#UEW6pGPhNk8H!!DUQR~#F9jEMI6T*OWfN^Ze&X(4nV$wa8QUJ>oTkruH# zm~O<`J7Wxseo@FqaZMl#Y(mrFW9AHM9Kb|XBMqaZ2a)DvJgYipkDD_VUF_PKd~dT7 z#02}bBfPn9a!X!O#83=lbJSK#E}K&yx-HI#T6ua)6o0{|={*HFusCkHzs|Fn&|C3H zBck1cmfcWVUN&i>X$YU^Sn6k2H;r3zuXbJFz)r5~3$d$tUj(l1?o={MM){kjgqXRO zc5R*#{;V7AQh|G|)jLM@wGAK&rm2~@{Pewv#06pHbKn#wL0P6F1!^qw9g&cW3Z=9} zj)POhOlwsh@eF=>z?#sIs*C-Nl(yU!#DaiaxhEs#iJqQ8w%(?+6lU02MYSeDkr!B- zPjMv+on6OLXgGnAtl(ao>|X2Y8*Hb}GRW5}-IzXnoo-d0!m4Vy$GS!XOLy>3_+UGs z2D|YcQx@M#M|}TDOetGi{9lGo9m-=0-^+nKE^*?$^uHkxZh}I{#UTQd;X!L+W@jm( zDg@N4+lUqI92o_rNk{3P>1gxAL=&O;x)ZT=q1mk0kLlE$WeWuY_$0`0jY-Kkt zP*|m3AF}Ubd=`<>(Xg0har*_@x2YH}bn0Wk*OZz3*e5;Zc;2uBdnl8?&XjupbkOeNZsNh6pvsq_ydmJI+*z**{I{0K)-;p1~k8cpJXL$^t!-`E}=*4G^-E8>H!LjTPxSx zcF+cS`ommfKMhNSbas^@YbTpH1*RFrBuATUR zt{oFWSk^$xU&kbFQ;MCX22RAN5F6eq9UfR$ut`Jw--p2YX)A*J69m^!oYfj2y7NYcH6&r+0~_sH^c^nzeN1AU4Ga7=FlR{S|Mm~MpzY0$Z+p2W(a={b-pR9EO1Rs zB%KY|@wLcAA@)KXi!d2_BxrkhDn`DT1=Dec}V!okd{$+wK z4E{n8R*xKyci1(CnNdhf$Dp2(Jpof0-0%-38X=Dd9PQgT+w%Lshx9+loPS~MOm%ZT zt%2B2iL_KU_ita%N>xjB!#71_3=3c}o zgeW~^U_ZTJQ2!PqXulQd=3b=XOQhwATK$y(9$#1jOQ4}4?~l#&nek)H(04f(Sr=s| zWv7Lu1=%WGk4FSw^;;!8&YPM)pQDCY9DhU`hMty1@sq1=Tj7bFsOOBZOFlpR`W>-J$-(kezWJj;`?x-v>ev{*8V z8p|KXJPV$HyQr1A(9LVrM47u-XpcrIyO`yWvx1pVYc&?154aneRpLqgx)EMvRaa#|9?Wwqs2+W8n5~79G z(}iCiLk;?enn}ew`HzhG+tu+Ru@T+K5juvZN)wY;x6HjvqD!&!)$$;1VAh~7fg0K| zEha#aN=Yv|3^~YFH}cc38ovVb%L|g@9W6fo(JtT6$fa?zf@Ct88e}m?i)b*Jgc{fl zExfdvw-BYDmH6>(4QMt#p0;FUIQqkhD}aH?a7)_%JtA~soqj{ppP_82yi9kaxuK>~ ze_)Zt>1?q=ZH*kF{1iq9sr*tVuy=u>Zev}!gEZx@O6-fjyu9X00gpIl-fS_pzjpqJ z1yqBmf9NF!jaF<+YxgH6oXBdK)sH(>VZ)1siyA$P<#KDt;8NT*l_0{xit~5j1P)FN zI8hhYKhQ)i z37^aP13B~u65?sg+_@2Kr^iWHN=U;EDSZ@2W2!5ALhGNWXnFBY%7W?1 z=HI9JzQ-pLKZDYTv<0-lt|6c-RwhxZ)mU2Os{bsX_i^@*fKUj8*aDO5pks=qn3Dv6 zwggpKLuyRCTVPwmw1r}B#AS}?X7b837UlXwp~E2|PJw2SGVueL7){Y&z!jL!XN=0i zU^Eig`S2`{+gU$68aRdWx?BZ{sU_f=8sn~>s~M?GU~`fH5kCc; z8ICp+INM3(3{#k32RZdv6b9MQYdZXNuk7ed8;G?S2nT+NZBG=Tar^KFl2SvhW$bGW#kdWL-I)s_IqVnCDDM9fm8g;P;8 z7t4yZn3^*NQfx7SwmkzP$=fwdC}bafQSEF@pd&P8@H#`swGy_rz;Z?Ty5mkS%>m#% zp_!m9e<()sfKiY(nF<1zBz&&`ZlJf6QLvLhl`_``%RW&{+O>Xhp;lwSsyRqGf=RWd zpftiR`={2(siiPAS|p}@q=NhVc0ELprt%=fMXO3B)4ryC2LT(o=sLM7hJC!}T1@)E zA3^J$3&1*M6Xq>03FX`R&w*NkrZE?FwU+Muut;>qNhj@bX17ZJxnOlPSZ=Zeiz~T_ zOu#yc3t6ONHB;?|r4w+pI)~KGN;HOGC)txxiUN8#mexj+W(cz%9a4sx|IRG=}ia zuEBuba3AHsV2feqw-3MvuL`I+2|`Ud4~7ZkN=JZ;L20|Oxna5vx1qbIh#k2O4$RQF zo`tL()zxaqibg^GbB+BS5#U{@K;WWQj~GcB1zb}zJkPwH|5hZ9iH2308!>_;%msji zJHSL~s)YHBR=Koa1mLEOHos*`gp=s8KA-C zu0aE+W!#iJ*0xqKm3A`fUGy#O+X+5W36myS>Uh2!R*s$aCU^`K&KKLCCDkejX2p=5 z%o7-fl03x`gaSNyr?3_JLv?2RLS3F*8ub>Jd@^Cc17)v8vYEK4aqo?OS@W9mt%ITJ z9=S2%R8M){CugT@k~~0x`}Vl!svYqX=E)c_oU6o}#Hb^%G1l3BudxA{F*tbjG;W_>=xV73pKY53v%>I)@D36I_@&p$h|Aw zonQS`07z_F#@T-%@-Tb|)7;;anoD_WH>9ewFy(ZcEOM$#Y)8>qi7rCnsH9GO-_7zF zu*C87{Df1P4TEOsnzZ@H%&lvV(3V@;Q!%+OYRp`g05PjY^gL$^$-t0Y>H*CDDs?FZly*oZ&dxvsxaUWF!{em4{A>n@vpXg$dwvt@_rgmHF z-MER`ABa8R-t_H*kv>}CzOpz;!>p^^9ztHMsHL|SRnS<-y5Z*r(_}c4=fXF`l^-i}>e7v!qs_jv zqvWhX^F=2sDNWA9c@P0?lUlr6ecrTKM%pNQ^?*Lq?p-0~?_j50xV%^(+H>sMul#Tw zeciF*1=?a7cI(}352%>LO96pD+?9!fNyl^9v3^v&Y4L)mNGK0FN43&Xf8jUlxW1Bw zyiu2;qW-aGNhs=zbuoxnxiwZ3{PFZM#Kw)9H@(hgX23h(`Wm~m4&TvoZoYp{plb^> z_#?vXcxd>r7K+1HKJvhed>gtK`TAbJUazUWQY6T~t2af%#<+Veyr%7-#*A#@&*;@g58{i|E%6yC_InGXCOd{L0;$)z#?n7M`re zh!kO{6=>7I?*}czyF7_frt#)s1CFJ_XE&VrDA?Dp3XbvF{qsEJgb&OLSNz_5g?HpK z9)8rsr4JN!Af3G9!#Qn(6zaUDqLN(g2g8*M)Djap?WMK9NKlkC)E2|-g|#-rp%!Gz zAHd%`iq|81efi93m3yTBw3g0j#;Yb2X{mhRAI?&KDmbGqou(2xiRNb^sV}%%Wu0?< z?($L>(#BO*)^)rSgyNRni$i`R4v;GhlCZ8$@e^ROX(p=2_v6Y!%^As zu022)fHdv_-~Yu_H6WVPLpHQx!W%^6j)cBhS`O3QBW#x(eX54d&I22op(N59b*&$v zFiSRY6rOc^(dgSV1>a7-5C;(5S5MvKcM2Jm-LD9TGqDpP097%52V+0>Xqq!! zq4e3vj53SE6i8J`XcQB|MZPP8j;PAOnpGnllH6#Ku~vS42xP*Nz@~y%db7Xi8s09P z1)e%8ys6&M8D=Dt6&t`iKG_4X=!kgRQoh%Z`dc&mlOUqXk-k`jKv9@(a^2-Upw>?< zt5*^DV~6Zedbec4NVl($2T{&b)zA@b#dUyd>`2JC0=xa_fIm8{5um zr-!ApXZhC8@=vC2WyxO|!@0Km)h8ep*`^he92$@YwP>VcdoS5OC^s38e#7RPsg4j+ zbVGG}WRSET&ZfrcR(x~k8n1rTP%CnfUNKUonD$P?FtNFF#cn!wEIab-;jU=B1dHK@ z(;(yAQJ`O$sMn>h;pf^8{JISW%d+@v6@CnXh9n5TXGC}?FI9i-D0OMaIg&mAg=0Kn zNJ7oz5*ReJukD55fUsMuaP+H4tDN&V9zfqF@ zr=#ecUk9wu{0;!+gl;3Bw=Vn^)z$ahVhhw)io!na&9}LmWurLb0zubxK=UEnU*{5P z+SP}&*(iBKSO4{alBHaY^)5Q=mZ+2OwIooJ7*Q5XJ+2|q`9#f?6myq!&oz?klihLq z4C)$XP!BNS0G_Z1&TM>?Jk{S~{F3n83ioli=IO6f%wkvCl(RFFw~j0tb{GvXTx>*sB0McY0s&SNvj4+^h`9nJ_wM>F!Uc>X}9PifQekn0sKI2SAJP!a4h z5cyGTuCj3ZBM^&{dRelIlT^9zcfaAuL5Y~bl!ppSf`wZbK$z#6U~rdclk``e+!qhe z6Qspo*%<)eu6?C;Bp<^VuW6JI|Ncvyn+LlSl;Mp22Bl7ARQ0Xc24%29(ZrdsIPw&-=yHQ7_Vle|5h>AST0 zUGX2Zk34vp?U~IHT|;$U86T+UUHl_NE4m|}>E~6q``7hccCaT^#y+?wD##Q%HwPd8 zV3x4L4|qqu`B$4(LXqDJngNy-{&@aFBvVsywt@X^}iH7P%>bR?ciC$I^U-4Foa`YKI^qDyGK7k%E%c_P=yzAi`YnxGA%DeNd++j3*h^ z=rn>oBd0|~lZ<6YvmkKY*ZJlJ;Im0tqgWu&E92eqt;+NYdxx`eS(4Hw_Jb5|yVvBg z*tbdY^!AN;luEyN4VRhS@-_DC{({ziH{&Z}iGElSV~qvT>L-8G%+yEL zX#MFOhj{InyKG=mvW-<1B@c-}x$vA(nU?>S>0*eN#!SLzQ)Ex7fvQ)S4D<8|I#N$3 zT5Ei`Z?cxBODHX8(Xp73v`IsAYC@9b;t}z0wxVuQSY1J^GRwDPN@qbM-ZF48T$GZ< z8WU+;Pqo?{ghI-KZ-i*ydXu`Ep0Xw^McH_KE9J0S7G;x8Fe`DVG?j3Pv=0YzJ}yZR z%2=oqHiUjvuk0~Ca>Kol4CFi0_xQT~;_F?=u+!kIDl-9g`#ZNZ9HCy17Ga1v^Jv9# z{T4Kb1-AzUxq*MutfOWWZgD*HnFfyYg0&e9f(5tZ>krPF6{VikNeHoc{linPPt#Si z&*g>(c54V8rT_AX!J&bNm-!umPvOR}vDai#`CX___J#=zeB*{4<&2WpaDncZsOkp* zsg<%@@rbrMkR_ux9?LsQxzoBa1s%$BBn6vk#{&&zUwcfzeCBJUwFYSF$08qDsB;gWQN*g!p8pxjofWbqNSZOEKOaTx@+* zwdt5*Q47@EOZ~EZL9s?1o?A%9TJT=Ob_13yyugvPg*e&ZU(r6^k4=2+D-@n=Hv5vu zSXG|hM(>h9^zn=eQ=$6`JO&70&2|%V5Lsx>)(%#;pcOfu>*nk_3HB_BNaH$`jM<^S zcSftDU1?nL;jy)+sfonQN}(}gUW?d_ikr*3=^{G)=tjBtEPe>TO|0ddVB zTklrSHiW+!#26frPXQQ(YN8DG$PZo?(po(QUCCf_OJC`pw*uey00%gmH!`WJkrKXj2!#6?`T25mTu9OJp2L8z3! z=arrL$ZqxuE{%yV)14Kd>k}j7pxZ6#$Dz8$@WV5p8kTqN<-7W)Q7Gt2{KoOPK_tZ| zf2WG~O5@{qPI+W<4f_;reuFVdO^5`ADC1!JQE|N`s3cq@(0WB!n0uh@*c{=LAd;~} zyGK@hbF-Oo+!nN)@i*O(`@FA#u?o=~e{`4O#5}z&=UkU*50fOrzi11D^&FOqe>wii z?*k+2|EcUs;Gx{!@KBT~>PAwLrIDT7Th=Utu?~?np@t^gFs?zgX=D${RwOY^WGh-+ z+#4$066ISh8eYW#FXWp~S`<*%O^ZuItL1Tyqt8#tZ zY120E;^VG`!lZn&3sPd$RkdHpU#|w+bYV)pJC|SH9g%|5IkxVTQcBA4CL0}$&}ef@ zW^Vtj%M;;_1xxP9x#ex17&4N*{ksO*_4O}xYu(p*JkL#yr}@7b)t5X?%CY<+s5_MJ zuiqt+N_;A(_)%lumoyRFixWa-M7qK_9s6<1X?JDa9fP!+_6u~~M$5L=ipB=7(j#f< zZ34J%=bs549%~_mA(|={uZNs_0?o7;-LBP(ZRnkd{-^|2|=4vUTmtByHL8 zEph`(LSEzQj68a+`d$V<45J7cyv^#|^|%fD#si1Nx!4NW*`l*{->HEWNh6-|g>-=r zXmQ|-i}Ku$ndUeHQ^&ieT!Lf}vf6GaqW9$DJ2NWrqwPY%%4nip$@vK$nRp*_C-v<| zuKz~ZyN&<%!NS26&x?jhy+@awJipMQ-8(X4#Ae5??U<1QMt1l9R=w9fAnEF}NYu$2 z>6}Vkc zIb*A?G*z8^IvibmBKn_u^5&T_1oey0gZS2~obf(#xk=erZGTEdQnt3DMGM+0oPwss zj5zXD;(oWhB_T@~Ig#9@v)AKtXu3>Inmgf@A|-lD-1U>cNyl3h?ADD9)GG4}zUGPk zZzaXe!~Kf?<~@$G?Uql3t8jy9{2!doq4=J}j9ktTxss{p6!9UdjyDERlA*xZ!=Q)KDs5O)phz>Vq3BNGoM(H|=1*Q4$^2fTZw z(%nq1P|5Rt81}SYJpEEzMPl5VJsV5&4e)ZWKDyoZ>1EwpkHx-AQVQc8%JMz;{H~p{=FXV>jIxvm4X*qv52e?Y-f%DJ zxEA165GikEASQ^fH6K#d!Tpu2HP{sFs%E=e$gYd$aj$+xue6N+Wc(rAz~wUsk2`(b z8Kvmyz%bKQxpP}~baG-rwYcYCvkHOi zlkR<=>ZBTU*8RF_d#Bl@zZsRIhx<%~Z@Z=ik z>adw3!DK(8R|q$vy{FTxw%#xliD~6qXmY^7_9kthVPTF~Xy1CfBqbU~?1QmxmU=+k z(ggxvEuA;0e&+ci-zQR{-f7aO{O(Pz_OsEjLh_K>MbvoZ4nxtk5u{g@nPv)cgW_R} z9}EA4K4@z0?7ue}Z(o~R(X&FjejUI2g~08PH1E4w>9o{)S(?1>Z0XMvTb|;&EuyOE zGvWNpYX)Nv<8|a^;1>bh#&znEcl-r!T#pn= z4$?Yudha6F%4b>*8@=BdtXXY4N+`U4Dmx$}>HeVJk-QdTG@t!tVT#0(LeV0gvqyyw z2sEp^9eY0N`u10Tm4n8No&A=)IeEC|gnmEXoNSzu!1<4R<%-9kY_8~5Ej?zRegMn78wuMs#;i&eUA0Zk_RXQ3b&TT} z;SCI=7-FUB@*&;8|n>(_g^HGf3@QODE3LpmX~ELnymQm{Sx9xrKS zK29p~?v@R$0=v6Dr5aW>-!{+h@?Q58|Kz8{{W`%J+lDAdb&M5VHrX_mDY;1-JLnf)ezmPau$)1;=`-FU=-r-83tX=C`S#}GZufju zQ>sXNT0Ny=k@nc%cFnvA_i4SC)?_ORXHq8B4D%el1uPX`c~uG#S1M7C+*MMqLw78E zhY2dI8@+N^qrMI1+;TUda(vGqGSRyU{Fnm`aqrr7bz42c5xsOO-~oZpkzorD1g}Y<6rk&3>PsSGy}W?MtqFky@A(X# zIuNZK0cK?^=;PUAu>j0#HtjbHCV*6?jzA&OoE$*Jlga*}LF`SF?WLhv1O|zqC<>*> zYB;#lsYKx0&kH@BFpW8n*yDcc6?;_zaJs<-jPSkCsSX-!aV=P5kUgF@Nu<{a%#K*F z134Q{9|YX7X(v$62_cY3^G%t~rD>Q0z@)1|zs)vjJ6Jq9;7#Ki`w+eS**En?7;n&7 zu==V3T&eFboN3ZiMx3D8qYc;VjFUk_H-WWCau(VFXSQf~viH0L$gwD$UfFHqNcgN`x}M+YQ6RnN<+@t>JUp#)9YOkqst-Ga?{FsDpEeX0(5v{0J~SEbWiL zXC2}M4?UH@u&|;%0y`eb33ldo4~z-x8zY!oVmV=c+f$m?RfDC35mdQ2E>Pze7KWP- z>!Bh<&57I+O_^s}9Tg^k)h7{xx@0a0IA~GAOt2yy!X%Q$1rt~LbTB6@Du!_0%HV>N zlf)QI1&gvERKwso23mJ!Ou6ZS#zCS5W`gxE5T>C#E|{i<1D35C222I33?Njaz`On7 zi<+VWFP6D{e-{yiN#M|Jgk<44u1TiMI78S5W`Sdb5f+{zu34s{CfWN7a3Cf^@L%!& zN$?|!!9j2c)j$~+R6n#891w-z8(!oBpL2K=+%a$r2|~8-(vQj5_XT`<0Ksf;oP+tz z9CObS!0m)Tgg`K#xBM8B(|Z)Wb&DYL{WTYv`;A=q6~Nnx2+!lTIXtj8J7dZE!P_{z z#f8w6F}^!?^KE#+ZDv+xd5O&3EmomZzsv?>E-~ygGum45fk!SBN&|eo1rKw^?aZJ4 E2O(~oYXATM literal 54329 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

<5G2M1WZP5 zzqSuO91lJod(SBDDw<*sX(+F6Uq~YAeYV#2A;XQu_p=N5X+#cmu19Qk>QAnV=k!?wbk5I;tDWgFc}0NkvC*G=V+Yh1cyeJVq~9czZiDXe+S=VfL2g`LWo8om z$Y~FQc6MFjV-t1Y`^D9XMwY*U_re2R?&(O~68T&D4S{X`6JYU-pz=}ew-)V0AOUT1 zVOkHAB-8uBcRjLvz<9HS#a@X*Kc@|W)nyiSgi|u5$Md|P()%2(?olGg@ypoJwp6>m z*dnfjjWC>?_1p;%1brqZyDRR;8EntVA92EJ3ByOxj6a+bhPl z;a?m4rQAV1@QU^#M1HX)0+}A<7TCO`ZR_RzF}X9-M>cRLyN4C+lCk2)kT^3gN^`IT zNP~fAm(wyIoR+l^lQDA(e1Yv}&$I!n?&*p6?lZcQ+vGLLd~fM)qt}wsbf3r=tmVYe zl)ntf#E!P7wlakP9MXS7m0nsAmqxZ*)#j;M&0De`oNmFgi$ov#!`6^4)iQyxg5Iuj zjLAhzQ)r`^hf7`*1`Rh`X;LVBtDSz@0T?kkT1o!ijeyTGt5vc^Cd*tmNgiNo^EaWvaC8$e+nb_{W01j3%=1Y&92YacjCi>eNbwk%-gPQ@H-+4xskQ}f_c=jg^S-# zYFBDf)2?@5cy@^@FHK5$YdAK9cI;!?Jgd}25lOW%xbCJ>By3=HiK@1EM+I46A)Lsd zeT|ZH;KlCml=@;5+hfYf>QNOr^XNH%J-lvev)$Omy8MZ`!{`j>(J5cG&ZXXgv)TaF zg;cz99i$4CX_@3MIb?GL0s*8J=3`#P(jXF(_(6DXZjc@(@h&=M&JG)9&Te1?(^XMW zjjC_70|b=9hB6pKQi`S^Ls7JyJw^@P>Ko^&q8F&?>6i;#CbxUiLz1ZH4lNyd@QACd zu>{!sqjB!2Dg}pbAXD>d!3jW}=5aN0b;rw*W>*PAxm7D)aw(c*RX2@bTGEI|RRp}vw7;NR2wa;rXN{L{Q#=Fa z$x@ms6pqb>!8AuV(prv>|aU8oWV={C&$c zMa=p=CDNOC2tISZcd8~18GN5oTbKY+Vrq;3_obJlfSKRMk;Hdp1`y`&LNSOqeauR_ z^j*Ojl3Ohzb5-a49A8s|UnM*NM8tg}BJXdci5%h&;$afbmRpN0&~9rCnBA`#lG!p zc{(9Y?A0Y9yo?wSYn>iigf~KP$0*@bGZ>*YM4&D;@{<%Gg5^uUJGRrV4 z(aZOGB&{_0f*O=Oi0k{@8vN^BU>s3jJRS&CJOl3o|BE{FAA&a#2YYiX3pZz@|Go-F z|Fly;7eX2OTs>R}<`4RwpHFs9nwh)B28*o5qK1Ge=_^w0m`uJOv!=&!tzt#Save(C zgKU=Bsgql|`ui(e1KVxR`?>Dx>(rD1$iWp&m`v)3A!j5(6vBm*z|aKm*T*)mo(W;R zNGo2`KM!^SS7+*9YxTm6YMm_oSrLceqN*nDOAtagULuZl5Q<7mOnB@Hq&P|#9y{5B z!2x+2s<%Cv2Aa0+u{bjZXS);#IFPk(Ph-K7K?3i|4ro> zRbqJoiOEYo(Im^((r}U4b8nvo_>4<`)ut`24?ILnglT;Pd&U}$lV3U$F9#PD(O=yV zgNNA=GW|(E=&m_1;uaNmipQe?pon4{T=zK!N!2_CJL0E*R^XXIKf*wi!>@l}3_P9Z zF~JyMbW!+n-+>!u=A1ESxzkJy$DRuG+$oioG7(@Et|xVbJ#BCt;J43Nvj@MKvTxzy zMmjNuc#LXBxFAwIGZJk~^!q$*`FME}yKE8d1f5Mp}KHNq(@=Z8YxV}0@;YS~|SpGg$_jG7>_8WWYcVx#4SxpzlV9N4aO>K{c z$P?a_fyDzGX$Of3@ykvedGd<@-R;M^Shlj*SswJLD+j@hi_&_>6WZ}#AYLR0iWMK|A zH_NBeu(tMyG=6VO-=Pb>-Q#$F*or}KmEGg*-n?vWQREURdB#+6AvOj*I%!R-4E_2$ zU5n9m>RWs|Wr;h2DaO&mFBdDb-Z{APGQx$(L`if?C|njd*fC=rTS%{o69U|meRvu?N;Z|Y zbT|ojL>j;q*?xXmnHH#3R4O-59NV1j=uapkK7}6@Wo*^Nd#(;$iuGsb;H315xh3pl zHaJ>h-_$hdNl{+|Zb%DZH%ES;*P*v0#}g|vrKm9;j-9e1M4qX@zkl&5OiwnCz=tb6 zz<6HXD+rGIVpGtkb{Q^LIgExOm zz?I|oO9)!BOLW#krLmWvX5(k!h{i>ots*EhpvAE;06K|u_c~y{#b|UxQ*O@Ks=bca z^_F0a@61j3I(Ziv{xLb8AXQj3;R{f_l6a#H5ukg5rxwF9A$?Qp-Mo54`N-SKc}fWp z0T)-L@V$$&my;l#Ha{O@!fK4-FSA)L&3<${Hcwa7ue`=f&YsXY(NgeDU#sRlT3+9J z6;(^(sjSK@3?oMo$%L-nqy*E;3pb0nZLx6 z;h5)T$y8GXK1DS-F@bGun8|J(v-9o=42&nLJy#}M5D0T^5VWBNn$RpC zZzG6Bt66VY4_?W=PX$DMpKAI!d`INr) zkMB{XPQ<52rvWVQqgI0OL_NWxoe`xxw&X8yVftdODPj5|t}S6*VMqN$-h9)1MBe0N zYq?g0+e8fJCoAksr0af1)FYtz?Me!Cxn`gUx&|T;)695GG6HF7!Kg1zzRf_{VWv^bo81v4$?F6u2g|wxHc6eJQAg&V z#%0DnWm2Rmu71rPJ8#xFUNFC*V{+N_qqFH@gYRLZ6C?GAcVRi>^n3zQxORPG)$-B~ z%_oB?-%Zf7d*Fe;cf%tQwcGv2S?rD$Z&>QC2X^vwYjnr5pa5u#38cHCt4G3|efuci z@3z=#A13`+ztmp;%zjXwPY_aq-;isu*hecWWX_=Z8paSqq7;XYnUjK*T>c4~PR4W7 z#C*%_H&tfGx`Y$w7`dXvVhmovDnT>btmy~SLf>>~84jkoQ%cv=MMb+a{JV&t0+1`I z32g_Y@yDhKe|K^PevP~MiiVl{Ou7^Mt9{lOnXEQ`xY^6L8D$705GON{!1?1&YJEl#fTf5Z)da=yiEQ zGgtC-soFGOEBEB~ZF_{7b(76En>d}mI~XIwNw{e>=Fv)sgcw@qOsykWr?+qAOZSVrQfg}TNI ztKNG)1SRrAt6#Q?(me%)>&A_^DM`pL>J{2xu>xa$3d@90xR61TQDl@fu%_85DuUUA za9tn64?At;{`BAW6oykwntxHeDpXsV#{tmt5RqdN7LtcF4vR~_kZNT|wqyR#z^Xcd zFdymVRZvyLfTpBT>w9<)Ozv@;Yk@dOSVWbbtm^y@@C>?flP^EgQPAwsy75bveo=}T zFxl(f)s)j(0#N_>Or(xEuV(n$M+`#;Pc$1@OjXEJZumkaekVqgP_i}p`oTx;terTx zZpT+0dpUya2hqlf`SpXN{}>PfhajNk_J0`H|2<5E;U5Vh4F8er z;RxLSFgpGhkU>W?IwdW~NZTyOBrQ84H7_?gviIf71l`EETodG9a1!8e{jW?DpwjL? zGEM&eCzwoZt^P*8KHZ$B<%{I}>46IT%jJ3AnnB5P%D2E2Z_ z1M!vr#8r}1|KTqWA4%67ZdbMW2YJ81b(KF&SQ2L1Qn(y-=J${p?xLMx3W7*MK;LFQ z6Z`aU;;mTL4XrrE;HY*Rkh6N%?qviUGNAKiCB~!P}Z->IpO6E(gGd7I#eDuT7j|?nZ zK}I(EJ>$Kb&@338M~O+em9(L!+=0zBR;JAQesx|3?Ok90)D1aS9P?yTh6Poh8Cr4X zk3zc=f2rE7jj+aP7nUsr@~?^EGP>Q>h#NHS?F{Cn`g-gD<8F&dqOh-0sa%pfL`b+1 zUsF*4a~)KGb4te&K0}bE>z3yb8% zibb5Q%Sfiv7feb1r0tfmiMv z@^4XYwg@KZI=;`wC)`1jUA9Kv{HKe2t$WmRcR4y8)VAFjRi zaz&O7Y2tDmc5+SX(bj6yGHYk$dBkWc96u3u&F)2yEE~*i0F%t9Kg^L6MJSb&?wrXi zGSc;_rln$!^ybwYBeacEFRsVGq-&4uC{F)*Y;<0y7~USXswMo>j4?~5%Zm!m@i@-> zXzi82sa-vpU{6MFRktJy+E0j#w`f`>Lbog{zP|9~hg(r{RCa!uGe>Yl536cn$;ouH za#@8XMvS-kddc1`!1LVq;h57~zV`7IYR}pp3u!JtE6Q67 zq3H9ZUcWPm2V4IukS}MCHSdF0qg2@~ufNx9+VMjQP&exiG_u9TZAeAEj*jw($G)zL zq9%#v{wVyOAC4A~AF=dPX|M}MZV)s(qI9@aIK?Pe+~ch|>QYb+78lDF*Nxz2-vpRbtQ*F4$0fDbvNM#CCatgQ@z1+EZWrt z2dZfywXkiW=no5jus-92>gXn5rFQ-COvKyegmL=4+NPzw6o@a?wGE-1Bt;pCHe;34K%Z z-FnOb%!nH;)gX+!a3nCk?5(f1HaWZBMmmC@lc({dUah+E;NOros{?ui1zPC-Q0);w zEbJmdE$oU$AVGQPdm{?xxI_0CKNG$LbY*i?YRQ$(&;NiA#h@DCxC(U@AJ$Yt}}^xt-EC_ z4!;QlLkjvSOhdx!bR~W|Ezmuf6A#@T`2tsjkr>TvW*lFCMY>Na_v8+{Y|=MCu1P8y z89vPiH5+CKcG-5lzk0oY>~aJC_0+4rS@c@ZVKLAp`G-sJB$$)^4*A!B zmcf}lIw|VxV9NSoJ8Ag3CwN&d7`|@>&B|l9G8tXT^BDHOUPrtC70NgwN4${$k~d_4 zJ@eo6%YQnOgq$th?0{h`KnqYa$Nz@vlHw<%!C5du6<*j1nwquk=uY}B8r7f|lY+v7 zm|JU$US08ugor8E$h3wH$c&i~;guC|3-tqJy#T;v(g( zBZtPMSyv%jzf->435yM(-UfyHq_D=6;ouL4!ZoD+xI5uCM5ay2m)RPmm$I}h>()hS zO!0gzMxc`BPkUZ)WXaXam%1;)gedA7SM8~8yIy@6TPg!hR0=T>4$Zxd)j&P-pXeSF z9W`lg6@~YDhd19B9ETv(%er^Xp8Yj@AuFVR_8t*KS;6VHkEDKI#!@l!l3v6`W1`1~ zP{C@keuV4Q`Rjc08lx?zmT$e$!3esc9&$XZf4nRL(Z*@keUbk!GZi(2Bmyq*saOD? z3Q$V<*P-X1p2}aQmuMw9nSMbOzuASsxten7DKd6A@ftZ=NhJ(0IM|Jr<91uAul4JR zADqY^AOVT3a(NIxg|U;fyc#ZnSzw2cr}#a5lZ38>nP{05D)7~ad7JPhw!LqOwATXtRhK!w0X4HgS1i<%AxbFmGJx9?sEURV+S{k~g zGYF$IWSlQonq6}e;B(X(sIH|;52+(LYW}v_gBcp|x%rEAVB`5LXg_d5{Q5tMDu0_2 z|LOm$@K2?lrLNF=mr%YP|U-t)~9bqd+wHb4KuPmNK<}PK6e@aosGZK57=Zt+kcszVOSbe;`E^dN! ze7`ha3WUUU7(nS0{?@!}{0+-VO4A{7+nL~UOPW9_P(6^GL0h${SLtqG!} zKl~Ng5#@Sy?65wk9z*3SA`Dpd4b4T^@C8Fhd8O)k_4%0RZL5?#b~jmgU+0|DB%0Z) zql-cPC>A9HPjdOTpPC` zQwvF}uB5kG$Xr4XnaH#ruSjM*xG?_hT7y3G+8Ox`flzU^QIgb_>2&-f+XB6MDr-na zSi#S+c!ToK84<&m6sCiGTd^8pNdXo+$3^l3FL_E`0 z>8it5YIDxtTp2Tm(?}FX^w{fbfgh7>^8mtvN>9fWgFN_*a1P`Gz*dyOZF{OV7BC#j zQV=FQM5m>47xXgapI$WbPM5V`V<7J9tD)oz@d~MDoM`R^Y6-Na(lO~uvZlpu?;zw6 zVO1faor3dg#JEb5Q*gz4<W8tgC3nE2BG2jeIQs1)<{In&7hJ39x=;ih;CJDy)>0S1at*7n?Wr0ahYCpFjZ|@u91Zl7( zv;CSBRC65-6f+*JPf4p1UZ)k=XivKTX6_bWT~7V#rq0Xjas6hMO!HJN8GdpBKg_$B zwDHJF6;z?h<;GXFZan8W{XFNPpOj!(&I1`&kWO86p?Xz`a$`7qV7Xqev|7nn_lQuX ziGpU1MMYt&5dE2A62iX3;*0WzNB9*nSTzI%62A+N?f?;S>N@8M=|ef3gtQTIA*=yq zQAAjOqa!CkHOQo4?TsqrrsJLclXcP?dlAVv?v`}YUjo1Htt;6djP@NPFH+&p1I+f_ z)Y279{7OWomY8baT(4TAOlz1OyD{4P?(DGv3XyJTA2IXe=kqD)^h(@*E3{I~w;ws8 z)ZWv7E)pbEM zd3MOXRH3mQhks9 zv6{s;k0y5vrcjXaVfw8^>YyPo=oIqd5IGI{)+TZq5Z5O&hXAw%ZlL}^6FugH;-%vP zAaKFtt3i^ag226=f0YjzdPn6|4(C2sC5wHFX{7QF!tG1E-JFA`>eZ`}$ymcRJK?0c zN363o{&ir)QySOFY0vcu6)kX#;l??|7o{HBDVJN+17rt|w3;(C_1b>d;g9Gp=8YVl zYTtA52@!7AUEkTm@P&h#eg+F*lR zQ7iotZTcMR1frJ0*V@Hw__~CL>_~2H2cCtuzYIUD24=Cv!1j6s{QS!v=PzwQ(a0HS zBKx04KA}-Ue+%9d`?PG*hIij@54RDSQpA7|>qYVIrK_G6%6;#ZkR}NjUgmGju)2F`>|WJoljo)DJgZr4eo1k1i1+o z1D{>^RlpIY8OUaOEf5EBu%a&~c5aWnqM zxBpJq98f=%M^{4mm~5`CWl%)nFR64U{(chmST&2jp+-r z3675V<;Qi-kJud%oWnCLdaU-)xTnMM%rx%Jw6v@=J|Ir=4n-1Z23r-EVf91CGMGNz zb~wyv4V{H-hkr3j3WbGnComiqmS0vn?n?5v2`Vi>{Ip3OZUEPN7N8XeUtF)Ry6>y> zvn0BTLCiqGroFu|m2zG-;Xb6;W`UyLw)@v}H&(M}XCEVXZQoWF=Ykr5lX3XWwyNyF z#jHv)A*L~2BZ4lX?AlN3X#axMwOC)PoVy^6lCGse9bkGjb=qz%kDa6}MOmSwK`cVO zt(e*MW-x}XtU?GY5}9{MKhRhYOlLhJE5=ca+-RmO04^ z66z{40J=s=ey9OCdc(RCzy zd7Zr1%!y3}MG(D=wM_ebhXnJ@MLi7cImDkhm0y{d-Vm81j`0mbi4lF=eirlr)oW~a zCd?26&j^m4AeXEsIUXiTal)+SPM4)HX%%YWF1?(FV47BaA`h9m67S9x>hWMVHx~Hg z1meUYoLL(p@b3?x|9DgWeI|AJ`Ia84*P{Mb%H$ZRROouR4wZhOPX15=KiBMHl!^JnCt$Az`KiH^_d>cev&f zaG2>cWf$=A@&GP~DubsgYb|L~o)cn5h%2`i^!2)bzOTw2UR!>q5^r&2Vy}JaWFUQE04v>2;Z@ZPwXr?y&G(B^@&y zsd6kC=hHdKV>!NDLIj+3rgZJ|dF`%N$DNd;B)9BbiT9Ju^Wt%%u}SvfM^=|q-nxDG zuWCQG9e#~Q5cyf8@y76#kkR^}{c<_KnZ0QsZcAT|YLRo~&tU|N@BjxOuy`#>`X~Q< z?R?-Gsk$$!oo(BveQLlUrcL#eirhgBLh`qHEMg`+sR1`A=1QX7)ZLMRT+GBy?&mM8 zQG^z-!Oa&J-k7I(3_2#Q6Bg=NX<|@X&+YMIOzfEO2$6Mnh}YV!m!e^__{W@-CTprr zbdh3f=BeCD$gHwCrmwgM3LAv3!Mh$wM)~KWzp^w)Cu6roO7uUG5z*}i0_0j47}pK; ztN530`ScGatLOL06~zO)Qmuv`h!gq5l#wx(EliKe&rz-5qH(hb1*fB#B+q`9=jLp@ zOa2)>JTl7ovxMbrif`Xe9;+fqB1K#l=Dv!iT;xF zdkCvS>C5q|O;}ns3AgoE({Ua-zNT-9_5|P0iANmC6O76Sq_(AN?UeEQJ>#b54fi3k zFmh+P%b1x3^)0M;QxXLP!BZ^h|AhOde*{9A=f3|Xq*JAs^Y{eViF|=EBfS6L%k4ip zk+7M$gEKI3?bQg?H3zaE@;cyv9kv;cqK$VxQbFEsy^iM{XXW0@2|DOu$!-k zSFl}Y=jt-VaT>Cx*KQnHTyXt}f9XswFB9ibYh+k2J!ofO+nD?1iw@mwtrqI4_i?nE zhLkPp41ED62me}J<`3RN80#vjW;wt`pP?%oQ!oqy7`miL>d-35a=qotK$p{IzeSk# ze_$CFYp_zIkrPFVaW^s#U4xT1lI^A0IBe~Y<4uS%zSV=wcuLr%gQT=&5$&K*bwqx| zWzCMiz>7t^Et@9CRUm9E+@hy~sBpm9fri$sE1zgLU((1?Yg{N1Sars=DiW&~Zw=3I zi7y)&oTC?UWD2w97xQ&5vx zRXEBGeJ(I?Y}eR0_O{$~)bMJRTsNUPIfR!xU9PE7A>AMNr_wbrFK>&vVw=Y;RH zO$mlpmMsQ}-FQ2cSj7s7GpC+~^Q~dC?y>M}%!-3kq(F3hGWo9B-Gn02AwUgJ>Z-pKOaj zysJBQx{1>Va=*e@sLb2z&RmQ7ira;aBijM-xQ&cpR>X3wP^foXM~u1>sv9xOjzZpX z0K;EGouSYD~oQ&lAafj3~EaXfFShC+>VsRlEMa9cg9i zFxhCKO}K0ax6g4@DEA?dg{mo>s+~RPI^ybb^u--^nTF>**0l5R9pocwB?_K)BG_)S zyLb&k%XZhBVr7U$wlhMqwL)_r&&n%*N$}~qijbkfM|dIWP{MyLx}X&}ES?}7i;9bW zmTVK@zR)7kE2+L42Q`n4m0VVg5l5(W`SC9HsfrLZ=v%lpef=Gj)W59VTLe+Z$8T8i z4V%5+T0t8LnM&H>Rsm5C%qpWBFqgTwL{=_4mE{S3EnBXknM&u8n}A^IIM4$s3m(Rd z>zq=CP-!9p9es2C*)_hoL@tDYABn+o#*l;6@7;knWIyDrt5EuakO99S$}n((Fj4y} zD!VvuRzghcE{!s;jC*<_H$y6!6QpePo2A3ZbX*ZzRnQq*b%KK^NF^z96CHaWmzU@f z#j;y?X=UP&+YS3kZx7;{ zDA{9(wfz7GF`1A6iB6fnXu0?&d|^p|6)%3$aG0Uor~8o? z*e}u#qz7Ri?8Uxp4m_u{a@%bztvz-BzewR6bh*1Xp+G=tQGpcy|4V_&*aOqu|32CM zz3r*E8o8SNea2hYJpLQ-_}R&M9^%@AMx&`1H8aDx4j%-gE+baf2+9zI*+Pmt+v{39 zDZ3Ix_vPYSc;Y;yn68kW4CG>PE5RoaV0n@#eVmk?p$u&Fy&KDTy!f^Hy6&^-H*)#u zdrSCTJPJw?(hLf56%2;_3n|ujUSJOU8VPOTlDULwt0jS@j^t1WS z!n7dZIoT+|O9hFUUMbID4Ec$!cc($DuQWkocVRcYSikFeM&RZ=?BW)mG4?fh#)KVG zcJ!<=-8{&MdE)+}?C8s{k@l49I|Zwswy^ZN3;E!FKyglY~Aq?4m74P-0)sMTGXqd5(S<-(DjjM z&7dL-Mr8jhUCAG$5^mI<|%`;JI5FVUnNj!VO2?Jiqa|c2;4^n!R z`5KK0hyB*F4w%cJ@Un6GC{mY&r%g`OX|1w2$B7wxu97%<@~9>NlXYd9RMF2UM>(z0 zouu4*+u+1*k;+nFPk%ly!nuMBgH4sL5Z`@Rok&?Ef=JrTmvBAS1h?C0)ty5+yEFRz zY$G=coQtNmT@1O5uk#_MQM1&bPPnspy5#>=_7%WcEL*n$;sSAZcXxMpcXxLe;_mLA z5F_paad+bGZV*oh@8h0(|D2P!q# zTHjmiphJ=AazSeKQPkGOR-D8``LjzToyx{lfK-1CDD6M7?pMZOdLKFtjZaZMPk4}k zW)97Fh(Z+_Fqv(Q_CMH-YYi?fR5fBnz7KOt0*t^cxmDoIokc=+`o# zrud|^h_?KW=Gv%byo~(Ln@({?3gnd?DUf-j2J}|$Mk>mOB+1{ZQ8HgY#SA8END(Zw z3T+W)a&;OO54~m}ffemh^oZ!Vv;!O&yhL0~hs(p^(Yv=(3c+PzPXlS5W79Er8B1o* z`c`NyS{Zj_mKChj+q=w)B}K za*zzPhs?c^`EQ;keH{-OXdXJet1EsQ)7;{3eF!-t^4_Srg4(Ot7M*E~91gwnfhqaM zNR7dFaWm7MlDYWS*m}CH${o?+YgHiPC|4?X?`vV+ws&Hf1ZO-w@OGG^o4|`b{bLZj z&9l=aA-Y(L11!EvRjc3Zpxk7lc@yH1e$a}8$_-r$)5++`_eUr1+dTb@ zU~2P1HM#W8qiNN3b*=f+FfG1!rFxnNlGx{15}BTIHgxO>Cq4 z;#9H9YjH%>Z2frJDJ8=xq>Z@H%GxXosS@Z>cY9ppF+)e~t_hWXYlrO6)0p7NBMa`+ z^L>-#GTh;k_XnE)Cgy|0Dw;(c0* zSzW14ZXozu)|I@5mRFF1eO%JM=f~R1dkNpZM+Jh(?&Zje3NgM{2ezg1N`AQg5%+3Y z64PZ0rPq6;_)Pj-hyIOgH_Gh`1$j1!jhml7ksHA1`CH3FDKiHLz+~=^u@kUM{ilI5 z^FPiJ7mSrzBs9{HXi2{sFhl5AyqwUnU{sPcUD{3+l-ZHAQ)C;c$=g1bdoxeG(5N01 zZy=t8i{*w9m?Y>V;uE&Uy~iY{pY4AV3_N;RL_jT_QtLFx^KjcUy~q9KcLE3$QJ{!)@$@En{UGG7&}lc*5Kuc^780;7Bj;)X?1CSy*^^ zPP^M)Pr5R>mvp3_hmCtS?5;W^e@5BjE>Cs<`lHDxj<|gtOK4De?Sf0YuK5GX9G93i zMYB{8X|hw|T6HqCf7Cv&r8A$S@AcgG1cF&iJ5=%+x;3yB`!lQ}2Hr(DE8=LuNb~Vs z=FO&2pdc16nD$1QL7j+!U^XWTI?2qQKt3H8=beVTdHHa9=MiJ&tM1RRQ-=+vy!~iz zj3O{pyRhCQ+b(>jC*H)J)%Wq}p>;?@W*Eut@P&?VU+Sdw^4kE8lvX|6czf{l*~L;J zFm*V~UC;3oQY(ytD|D*%*uVrBB}BbAfjK&%S;z;7$w68(8PV_whC~yvkZmX)xD^s6 z{$1Q}q;99W?*YkD2*;)tRCS{q2s@JzlO~<8x9}X<0?hCD5vpydvOw#Z$2;$@cZkYrp83J0PsS~!CFtY%BP=yxG?<@#{7%2sy zOc&^FJxsUYN36kSY)d7W=*1-{7ghPAQAXwT7z+NlESlkUH&8ODlpc8iC*iQ^MAe(B z?*xO4i{zFz^G=^G#9MsLKIN64rRJykiuIVX5~0#vAyDWc9-=6BDNT_aggS2G{B>dD ze-B%d3b6iCfc5{@yz$>=@1kdK^tX9qh0=ocv@9$ai``a_ofxT=>X7_Y0`X}a^M?d# z%EG)4@`^Ej_=%0_J-{ga!gFtji_byY&Vk@T1c|ucNAr(JNr@)nCWj?QnCyvXg&?FW;S-VOmNL6^km_dqiVjJuIASVGSFEos@EVF7St$WE&Z%)`Q##+0 zjaZ=JI1G@0!?l|^+-ZrNd$WrHBi)DA0-Eke>dp=_XpV<%CO_Wf5kQx}5e<90dt>8k zAi00d0rQ821nA>B4JHN7U8Zz=0;9&U6LOTKOaC1FC8GgO&kc=_wHIOGycL@c*$`ce703t%>S}mvxEnD-V!;6c`2(p74V7D0No1Xxt`urE66$0(ThaAZ1YVG#QP$ zy~NN%kB*zhZ2Y!kjn826pw4bh)75*e!dse+2Db(;bN34Uq7bLpr47XTX{8UEeC?2i z*{$`3dP}32${8pF$!$2Vq^gY|#w+VA_|o(oWmQX8^iw#n_crb(K3{69*iU?<%C-%H zuKi)3M1BhJ@3VW>JA`M>L~5*_bxH@Euy@niFrI$82C1}fwR$p2E&ZYnu?jlS}u7W9AyfdXh2pM>78bIt3 z)JBh&XE@zA!kyCDfvZ1qN^np20c1u#%P6;6tU&dx0phT1l=(mw7`u!-0e=PxEjDds z9E}{E!7f9>jaCQhw)&2TtG-qiD)lD(4jQ!q{`x|8l&nmtHkdul# zy+CIF8lKbp9_w{;oR+jSLtTfE+B@tOd6h=QePP>rh4@~!8c;Hlg9m%%&?e`*Z?qz5-zLEWfi>`ord5uHF-s{^bexKAoMEV@9nU z^5nA{f{dW&g$)BAGfkq@r5D)jr%!Ven~Q58c!Kr;*Li#`4Bu_?BU0`Y`nVQGhNZk@ z!>Yr$+nB=`z#o2nR0)V3M7-eVLuY`z@6CT#OTUXKnxZn$fNLPv7w1y7eGE=Qv@Hey`n;`U=xEl|q@CCV^#l)s0ZfT+mUf z^(j5r4)L5i2jnHW4+!6Si3q_LdOLQi<^fu?6WdohIkn79=jf%Fs3JkeXwF(?_tcF? z?z#j6iXEd(wJy4|p6v?xNk-)iIf2oX5^^Y3q3ziw16p9C6B;{COXul%)`>nuUoM*q zzmr|NJ5n)+sF$!yH5zwp=iM1#ZR`O%L83tyog-qh1I z0%dcj{NUs?{myT~33H^(%0QOM>-$hGFeP;U$puxoJ>>o-%Lk*8X^rx1>j|LtH$*)>1C!Pv&gd16%`qw5LdOIUbkNhaBBTo}5iuE%K&ZV^ zAr_)kkeNKNYJRgjsR%vexa~&8qMrQYY}+RbZ)egRg9_$vkoyV|Nc&MH@8L)`&rpqd zXnVaI@~A;Z^c3+{x=xgdhnocA&OP6^rr@rTvCnhG6^tMox$ulw2U7NgUtW%|-5VeH z_qyd47}1?IbuKtqNbNx$HR`*+9o=8`%vM8&SIKbkX9&%TS++x z5|&6P<%=F$C?owUI`%uvUq^yW0>`>yz!|WjzsoB9dT;2Dx8iSuK%%_XPgy0dTD4kd zDXF@&O_vBVVKQq(9YTClUPM30Sk7B!v7nOyV`XC!BA;BIVwphh+c)?5VJ^(C;GoQ$ zvBxr7_p*k$T%I1ke}`U&)$uf}I_T~#3XTi53OX)PoXVgxEcLJgZG^i47U&>LY(l%_ z;9vVDEtuMCyu2fqZeez|RbbIE7@)UtJvgAcVwVZNLccswxm+*L&w`&t=ttT=sv6Aq z!HouSc-24Y9;0q$>jX<1DnnGmAsP))- z^F~o99gHZw`S&Aw7e4id6Lg7kMk-e)B~=tZ!kE7sGTOJ)8@q}np@j7&7Sy{2`D^FH zI7aX%06vKsfJ168QnCM2=l|i>{I{%@gcr>ExM0Dw{PX6ozEuqFYEt z087%MKC;wVsMV}kIiuu9Zz9~H!21d!;Cu#b;hMDIP7nw3xSX~#?5#SSjyyg+Y@xh| z%(~fv3`0j#5CA2D8!M2TrG=8{%>YFr(j)I0DYlcz(2~92?G*?DeuoadkcjmZszH5& zKI@Lis%;RPJ8mNsbrxH@?J8Y2LaVjUIhRUiO-oqjy<&{2X~*f|)YxnUc6OU&5iac= z*^0qwD~L%FKiPmlzi&~a*9sk2$u<7Al=_`Ox^o2*kEv?p`#G(p(&i|ot8}T;8KLk- zPVf_4A9R`5^e`Om2LV*cK59EshYXse&IoByj}4WZaBomoHAPKqxRKbPcD`lMBI)g- zeMRY{gFaUuecSD6q!+b5(?vAnf>c`Z(8@RJy%Ulf?W~xB1dFAjw?CjSn$ph>st5bc zUac1aD_m6{l|$#g_v6;=32(mwpveQDWhmjR7{|B=$oBhz`7_g7qNp)n20|^^op3 zSfTdWV#Q>cb{CMKlWk91^;mHap{mk)o?udk$^Q^^u@&jd zfZ;)saW6{e*yoL6#0}oVPb2!}r{pAUYtn4{P~ES9tTfC5hXZnM{HrC8^=Pof{G4%Bh#8 ze~?C9m*|fd8MK;{L^!+wMy>=f^8b&y?yr6KnTq28$pFMBW9Oy7!oV5z|VM$s-cZ{I|Xf@}-)1=$V&x7e;9v81eiTi4O5-vs?^5pCKy2l>q);!MA zS!}M48l$scB~+Umz}7NbwyTn=rqt@`YtuwiQSMvCMFk2$83k50Q>OK5&fe*xCddIm)3D0I6vBU<+!3=6?(OhkO|b4fE_-j zimOzyfBB_*7*p8AmZi~X2bgVhyPy>KyGLAnOpou~sx9)S9%r)5dE%ADs4v%fFybDa_w*0?+>PsEHTbhKK^G=pFz z@IxLTCROWiKy*)cV3y%0FwrDvf53Ob_XuA1#tHbyn%Ko!1D#sdhBo`;VC*e1YlhrC z?*y3rp86m#qI|qeo8)_xH*G4q@70aXN|SP+6MQ!fJQqo1kwO_v7zqvUfU=Gwx`CR@ zRFb*O8+54%_8tS(ADh}-hUJzE`s*8wLI>1c4b@$al)l}^%GuIXjzBK!EWFO8W`>F^ ze7y#qPS0NI7*aU)g$_ziF(1ft;2<}6Hfz10cR8P}67FD=+}MfhrpOkF3hFhQu;Q1y zu%=jJHTr;0;oC94Hi@LAF5quAQ(rJG(uo%BiRQ@8U;nhX)j0i?0SL2g-A*YeAqF>RVCBOTrn{0R27vu}_S zS>tX4!#&U4W;ikTE!eFH+PKw%p+B(MR2I%n#+m0{#?qRP_tR@zpgCb=4rcrL!F=;A zh%EIF8m6%JG+qb&mEfuFTLHSxUAZEvC-+kvZKyX~SA3Umt`k}}c!5dy?-sLIM{h@> z!2=C)@nx>`;c9DdwZ&zeUc(7t<21D7qBj!|1^Mp1eZ6)PuvHx+poKSDCSBMFF{bKy z;9*&EyKitD99N}%mK8431rvbT+^%|O|HV23{;RhmS{$5tf!bIPoH9RKps`-EtoW5h zo6H_!s)Dl}2gCeGF6>aZtah9iLuGd19^z0*OryPNt{70RvJSM<#Ox9?HxGg04}b^f zrVEPceD%)#0)v5$YDE?f`73bQ6TA6wV;b^x*u2Ofe|S}+q{s5gr&m~4qGd!wOu|cZ||#h_u=k*fB;R6&k?FoM+c&J;ISg70h!J7*xGus)ta4veTdW)S^@sU@ z4$OBS=a~@F*V0ECic;ht4@?Jw<9kpjBgHfr2FDPykCCz|v2)`JxTH55?b3IM={@DU z!^|9nVO-R#s{`VHypWyH0%cs;0GO3E;It6W@0gX6wZ%W|Dzz&O%m17pa19db(er}C zUId1a4#I+Ou8E1MU$g=zo%g7K(=0Pn$)Rk z<4T2u<0rD)*j+tcy2XvY+0 z0d2pqm4)4lDewsAGThQi{2Kc3&C=|OQF!vOd#WB_`4gG3@inh-4>BoL!&#ij8bw7? zqjFRDaQz!J-YGitV4}$*$hg`vv%N)@#UdzHFI2E<&_@0Uw@h_ZHf}7)G;_NUD3@18 zH5;EtugNT0*RXVK*by>WS>jaDDfe!A61Da=VpIK?mcp^W?!1S2oah^wowRnrYjl~`lgP-mv$?yb6{{S55CCu{R z$9;`dyf0Y>uM1=XSl_$01Lc1Iy68IosWN8Q9Op=~I(F<0+_kKfgC*JggjxNgK6 z-3gQm6;sm?J&;bYe&(dx4BEjvq}b`OT^RqF$J4enP1YkeBK#>l1@-K`ajbn05`0J?0daOtnzh@l3^=BkedW1EahZlRp;`j*CaT;-21&f2wU z+Nh-gc4I36Cw+;3UAc<%ySb`#+c@5y ze~en&bYV|kn?Cn|@fqmGxgfz}U!98$=drjAkMi`43I4R%&H0GKEgx-=7PF}y`+j>r zg&JF`jomnu2G{%QV~Gf_-1gx<3Ky=Md9Q3VnK=;;u0lyTBCuf^aUi?+1+`4lLE6ZK zT#(Bf`5rmr(tgTbIt?yA@y`(Ar=f>-aZ}T~>G32EM%XyFvhn&@PWCm#-<&ApLDCXT zD#(9m|V(OOo7PmE@`vD4$S5;+9IQm19dd zvMEU`)E1_F+0o0-z>YCWqg0u8ciIknU#{q02{~YX)gc_u;8;i233D66pf(IkTDxeN zL=4z2)?S$TV9=ORVr&AkZMl<4tTh(v;Ix1{`pPVqI3n2ci&4Dg+W|N8TBUfZ*WeLF zqCH_1Q0W&f9T$lx3CFJ$o@Lz$99 zW!G&@zFHxTaP!o#z^~xgF|(vrHz8R_r9eo;TX9}2ZyjslrtH=%6O)?1?cL&BT(Amp zTGFU1%%#xl&6sH-UIJk_PGk_McFn7=%yd6tAjm|lnmr8bE2le3I~L{0(ffo}TQjyo zHZZI{-}{E4ohYTlZaS$blB!h$Jq^Rf#(ch}@S+Ww&$b);8+>g84IJcLU%B-W?+IY& zslcZIR>+U4v3O9RFEW;8NpCM0w1ROG84=WpKxQ^R`{=0MZCubg3st z48AyJNEvyxn-jCPTlTwp4EKvyEwD3e%kpdY?^BH0!3n6Eb57_L%J1=a*3>|k68A}v zaW`*4YitylfD}ua8V)vb79)N_Ixw_mpp}yJGbNu+5YYOP9K-7nf*jA1#<^rb4#AcS zKg%zCI)7cotx}L&J8Bqo8O1b0q;B1J#B5N5Z$Zq=wX~nQFgUfAE{@u0+EnmK{1hg> zC{vMfFLD;L8b4L+B51&LCm|scVLPe6h02rws@kGv@R+#IqE8>Xn8i|vRq_Z`V;x6F zNeot$1Zsu`lLS92QlLWF54za6vOEKGYQMdX($0JN*cjG7HP&qZ#3+bEN$8O_PfeAb z0R5;=zXac2IZ?fxu59?Nka;1lKm|;0)6|#RxkD05P5qz;*AL@ig!+f=lW5^Jbag%2 z%9@iM0ph$WFlxS!`p31t92z~TB}P-*CS+1Oo_g;7`6k(Jyj8m8U|Q3Sh7o-Icp4kV zK}%qri5>?%IPfamXIZ8pXbm-#{ytiam<{a5A+3dVP^xz!Pvirsq7Btv?*d7eYgx7q zWFxrzb3-%^lDgMc=Vl7^={=VDEKabTG?VWqOngE`Kt7hs236QKidsoeeUQ_^FzsXjprCDd@pW25rNx#6x&L6ZEpoX9Ffzv@olnH3rGOSW( zG-D|cV0Q~qJ>-L}NIyT?T-+x+wU%;+_GY{>t(l9dI%Ximm+Kmwhee;FK$%{dnF;C% zFjM2&$W68Sz#d*wtfX?*WIOXwT;P6NUw}IHdk|)fw*YnGa0rHx#paG!m=Y6GkS4VX zX`T$4eW9k1W!=q8!(#8A9h67fw))k_G)Q9~Q1e3f`aV@kbcSv7!priDUN}gX(iXTy zr$|kU0Vn%*ylmyDCO&G0Z3g>%JeEPFAW!5*H2Ydl>39w3W+gEUjL&vrRs(xGP{(ze zy7EMWF14@Qh>X>st8_029||TP0>7SG9on_xxeR2Iam3G~Em$}aGsNt$iES9zFa<3W zxtOF*!G@=PhfHO!=9pVPXMUVi30WmkPoy$02w}&6A7mF)G6-`~EVq5CwD2`9Zu`kd)52``#V zNSb`9dG~8(dooi1*-aSMf!fun7Sc`-C$-E(3BoSC$2kKrVcI!&yC*+ff2+C-@!AT_ zsvlAIV+%bRDfd{R*TMF><1&_a%@yZ0G0lg2K;F>7b+7A6pv3-S7qWIgx+Z?dt8}|S z>Qbb6x(+^aoV7FQ!Ph8|RUA6vXWQH*1$GJC+wXLXizNIc9p2yLzw9 z0=MdQ!{NnOwIICJc8!+Jp!zG}**r#E!<}&Te&}|B4q;U57$+pQI^}{qj669zMMe_I z&z0uUCqG%YwtUc8HVN7?0GHpu=bL7&{C>hcd5d(iFV{I5c~jpX&!(a{yS*4MEoYXh z*X4|Y@RVfn;piRm-C%b@{0R;aXrjBtvx^HO;6(>i*RnoG0Rtcd25BT6edxTNOgUAOjn zJ2)l{ipj8IP$KID2}*#F=M%^n&=bA0tY98@+2I+7~A&T-tw%W#3GV>GTmkHaqftl)#+E zMU*P(Rjo>8%P@_@#UNq(_L{}j(&-@1iY0TRizhiATJrnvwSH0v>lYfCI2ex^><3$q znzZgpW0JlQx?JB#0^^s-Js1}}wKh6f>(e%NrMwS`Q(FhazkZb|uyB@d%_9)_xb$6T zS*#-Bn)9gmobhAtvBmL+9H-+0_0US?g6^TOvE8f3v=z3o%NcPjOaf{5EMRnn(_z8- z$|m0D$FTU zDy;21v-#0i)9%_bZ7eo6B9@Q@&XprR&oKl4m>zIj-fiRy4Dqy@VVVs?rscG| zmzaDQ%>AQTi<^vYCmv#KOTd@l7#2VIpsj?nm_WfRZzJako`^uU%Nt3e;cU*y*|$7W zLm%fX#i_*HoUXu!NI$ey>BA<5HQB=|nRAwK!$L#n-Qz;~`zACig0PhAq#^5QS<8L2 zS3A+8%vbVMa7LOtTEM?55apt(DcWh#L}R^P2AY*c8B}Cx=6OFAdMPj1f>k3#^#+Hk z6uW1WJW&RlBRh*1DLb7mJ+KO>!t^t8hX1#_Wk`gjDio9)9IGbyCAGI4DJ~orK+YRv znjxRMtshZQHc$#Y-<-JOV6g^Cr@odj&Xw5B(FmI)*qJ9NHmIz_r{t)TxyB`L-%q5l ztzHgD;S6cw?7Atg*6E1!c6*gPRCb%t7D%z<(xm+K{%EJNiI2N0l8ud0Ch@_av_RW? zIr!nO4dL5466WslE6MsfMss7<)-S!e)2@r2o=7_W)OO`~CwklRWzHTfpB)_HYwgz=BzLhgZ9S<{nLBOwOIgJU=94uj6r!m>Xyn9>&xP+=5!zG_*yEoRgM0`aYts z^)&8(>z5C-QQ*o_s(8E4*?AX#S^0)aqB)OTyX>4BMy8h(cHjA8ji1PRlox@jB*1n? zDIfyDjzeg91Ao(;Q;KE@zei$}>EnrF6I}q&Xd=~&$WdDsyH0H7fJX|E+O~%LS*7^Q zYzZ4`pBdY{b7u72gZm6^5~O-57HwzwAz{)NvVaowo`X02tL3PpgLjwA`^i9F^vSpN zAqH3mRjG8VeJNHZ(1{%!XqC+)Z%D}58Qel{_weSEHoygT9pN@i zi=G;!Vj6XQk2tuJC>lza%ywz|`f7TIz*EN2Gdt!s199Dr4Tfd_%~fu8gXo~|ogt5Q zlEy_CXEe^BgsYM^o@L?s33WM14}7^T(kqohOX_iN@U?u;$l|rAvn{rwy>!yfZw13U zB@X9)qt&4;(C6dP?yRsoTMI!j-f1KC!<%~i1}u7yLXYn)(#a;Z6~r>hp~kfP));mi zcG%kdaB9H)z9M=H!f>kM->fTjRVOELNwh1amgKQT=I8J66kI)u_?0@$$~5f`u%;zl zC?pkr^p2Fe=J~WK%4ItSzKA+QHqJ@~m|Cduv=Q&-P8I5rQ-#G@bYH}YJr zUS(~(w|vKyU(T(*py}jTUp%I%{2!W!K(i$uvotcPjVddW z8_5HKY!oBCwGZcs-q`4Yt`Zk~>K?mcxg51wkZlX5e#B08I75F7#dgn5yf&Hrp`*%$ zQ;_Qg>TYRzBe$x=T(@WI9SC!ReSas9vDm(yslQjBJZde5z8GDU``r|N(MHcxNopGr z_}u39W_zwWDL*XYYt>#Xo!9kL#97|EAGyGBcRXtLTd59x%m=3i zL^9joWYA)HfL15l9%H?q`$mY27!<9$7GH(kxb%MV>`}hR4a?+*LH6aR{dzrX@?6X4 z3e`9L;cjqYb`cJmophbm(OX0b)!AFG?5`c#zLagzMW~o)?-!@e80lvk!p#&CD8u5_r&wp4O0zQ>y!k5U$h_K;rWGk=U)zX!#@Q%|9g*A zWx)qS1?fq6X<$mQTB$#3g;;5tHOYuAh;YKSBz%il3Ui6fPRv#v62SsrCdMRTav)Sg zTq1WOu&@v$Ey;@^+_!)cf|w_X<@RC>!=~+A1-65O0bOFYiH-)abINwZvFB;hJjL_$ z(9iScmUdMp2O$WW!520Hd0Q^Yj?DK%YgJD^ez$Z^?@9@Ab-=KgW@n8nC&88)TDC+E zlJM)L3r+ZJfZW_T$;Imq*#2<(j+FIk8ls7)WJ6CjUu#r5PoXxQs4b)mZza<8=v{o)VlLRM<9yw^0En#tXAj`Sylxvki{<1DPe^ zhjHwx^;c8tb?Vr$6ZB;$Ff$+3(*oinbwpN-#F)bTsXq@Sm?43MC#jQ~`F|twI=7oC zH4TJtu#;ngRA|Y~w5N=UfMZi?s0%ZmKUFTAye&6Y*y-%c1oD3yQ%IF2q2385Zl+=> zfz=o`Bedy|U;oxbyb^rB9ixG{Gb-{h$U0hVe`J;{ql!s_OJ_>>eoQn(G6h7+b^P48 zG<=Wg2;xGD-+d@UMZ!c;0>#3nws$9kIDkK13IfloGT@s14AY>&>>^#>`PT7GV$2Hp zN<{bN*ztlZu_%W=&3+=#3bE(mka6VoHEs~0BjZ$+=0`a@R$iaW)6>wp2w)=v2@|2d z%?34!+iOc5S@;AAC4hELWLH56RGxo4jw8MDMU0Wk2k_G}=Vo(>eRFo(g3@HjG|`H3 zm8b*dK=moM*oB<)*A$M9!!5o~4U``e)wxavm@O_R(`P|u%9^LGi(_%IF<6o;NLp*0 zKsfZ0#24GT8(G`i4UvoMh$^;kOhl?`0yNiyrC#HJH=tqOH^T_d<2Z+ zeN>Y9Zn!X4*DMCK^o75Zk2621bdmV7Rx@AX^alBG4%~;G_vUoxhfhFRlR&+3WwF^T zaL)8xPq|wCZoNT^>3J0K?e{J-kl+hu2rZI>CUv#-z&u@`hjeb+bBZ>bcciQVZ{SbW zez04s9oFEgc8Z+Kp{XFX`MVf-s&w9*dx7wLen(_@y34}Qz@&`$2+osqfxz4&d}{Ql z*g1ag00Gu+$C`0avds{Q65BfGsu9`_`dML*rX~hyWIe$T>CsPRoLIr%MTk3pJ^2zH1qub1MBzPG}PO;Wmav9w%F7?%l=xIf#LlP`! z_Nw;xBQY9anH5-c8A4mME}?{iewjz(Sq-29r{fV;Fc>fv%0!W@(+{={Xl-sJ6aMoc z)9Q+$bchoTGTyWU_oI19!)bD=IG&OImfy;VxNXoIO2hYEfO~MkE#IXTK(~?Z&!ae! zl8z{D&2PC$Q*OBC(rS~-*-GHNJ6AC$@eve>LB@Iq;jbBZj`wk4|LGogE||Ie=M5g= z9d`uYQ1^Sr_q2wmZE>w2WG)!F%^KiqyaDtIAct?}D~JP4shTJy5Bg+-(EA8aXaxbd~BKMtTf2iQ69jD1o* zZF9*S3!v-TdqwK$%&?91Sh2=e63;X0Lci@n7y3XOu2ofyL9^-I767eHESAq{m+@*r zbVDx!FQ|AjT;!bYsXv8ilQjy~Chiu&HNhFXt3R_6kMC8~ChEFqG@MWu#1Q1#=~#ix zrkHpJre_?#r=N0wv`-7cHHqU`phJX2M_^{H0~{VP79Dv{6YP)oA1&TSfKPEPZn2)G z9o{U1huZBLL;Tp_0OYw@+9z(jkrwIGdUrOhKJUbwy?WBt zlIK)*K0lQCY0qZ!$%1?3A#-S70F#YyUnmJF*`xx?aH5;gE5pe-15w)EB#nuf6B*c~ z8Z25NtY%6Wlb)bUA$w%HKs5$!Z*W?YKV-lE0@w^{4vw;J>=rn?u!rv$&eM+rpU6rc=j9>N2Op+C{D^mospMCjF2ZGhe4eADA#skp2EA26%p3Ex9wHW8l&Y@HX z$Qv)mHM}4*@M*#*ll5^hE9M^=q~eyWEai*P;4z<9ZYy!SlNE5nlc7gm;M&Q zKhKE4d*%A>^m0R?{N}y|i6i^k>^n4(wzKvlQeHq{l&JuFD~sTsdhs`(?lFK@Q{pU~ zb!M3c@*3IwN1RUOVjY5>uT+s-2QLWY z4T2>fiSn>>Fob+%B868-v9D@AfWr#M8eM6w#eAlhc#zk6jkLxGBGk`E3$!A@*am!R zy>29&ptYK6>cvP`b!syNp)Q$0UOW|-O@)8!?94GOYF_}+zlW%fCEl|Tep_zx05g6q z>tp47e-&R*hSNe{6{H!mL?+j$c^TXT{C&@T-xIaesNCl05 z9SLb@q&mSb)I{VXMaiWa3PWj=Ed!>*GwUe;^|uk=Pz$njNnfFY^MM>E?zqhf6^{}0 zx&~~dA5#}1ig~7HvOQ#;d9JZBeEQ+}-~v$at`m!(ai z$w(H&mWCC~;PQ1$%iuz3`>dWeb3_p}X>L2LK%2l59Tyc}4m0>9A!8rhoU3m>i2+hl zx?*qs*c^j}+WPs>&v1%1Ko8_ivAGIn@QK7A`hDz-Emkcgv2@wTbYhkiwX2l=xz*XG zaiNg+j4F-I>9v+LjosI-QECrtKjp&0T@xIMKVr+&)gyb4@b3y?2CA?=ooN zT#;rU86WLh(e@#mF*rk(NV-qSIZyr z$6!ZUmzD)%yO-ot`rw3rp6?*_l*@Z*IB0xn4|BGPWHNc-1ZUnNSMWmDh=EzWJRP`) zl%d%J613oXzh5;VY^XWJi{lB`f#u+ThvtP7 zq(HK<4>tw(=yzSBWtYO}XI`S1pMBe3!jFxBHIuwJ(@%zdQFi1Q_hU2eDuHqXte7Ki zOV55H2D6u#4oTfr7|u*3p75KF&jaLEDpxk!4*bhPc%mpfj)Us3XIG3 zIKMX^s^1wt8YK7Ky^UOG=w!o5e7W-<&c|fw2{;Q11vm@J{)@N3-p1U>!0~sKWHaL= zWV(0}1IIyt1p%=_-Fe5Kfzc71wg}`RDDntVZv;4!=&XXF-$48jS0Sc;eDy@Sg;+{A zFStc{dXT}kcIjMXb4F7MbX~2%i;UrBxm%qmLKb|2=?uPr00-$MEUIGR5+JG2l2Nq` zkM{{1RO_R)+8oQ6x&-^kCj)W8Z}TJjS*Wm4>hf+4#VJP)OBaDF%3pms7DclusBUw} z{ND#!*I6h85g6DzNvdAmnwWY{&+!KZM4DGzeHI?MR@+~|su0{y-5-nICz_MIT_#FE zm<5f3zlaKq!XyvY3H`9s&T};z!cK}G%;~!rpzk9-6L}4Rg7vXtKFsl}@sT#U#7)x- z7UWue5sa$R>N&b{J61&gvKcKlozH*;OjoDR+elkh|4bJ!_3AZNMOu?n9&|L>OTD78 z^i->ah_Mqc|Ev)KNDzfu1P3grBIM#%`QZqj5W{qu(HocQhjyS;UINoP`{J+DvV?|1 z_sw6Yr3z6%e7JKVDY<$P=M)dbk@~Yw9|2!Cw!io3%j92wTD!c^e9Vj+7VqXo3>u#= zv#M{HHJ=e$X5vQ>>ML?E8#UlmvJgTnb73{PSPTf*0)mcj6C z{KsfUbDK|F$E(k;ER%8HMdDi`=BfpZzP3cl5yJHu;v^o2FkHNk;cXc17tL8T!CsYI zfeZ6sw@;8ia|mY_AXjCS?kUfxdjDB28)~Tz1dGE|{VfBS9`0m2!m1yG?hR})er^pl4c@9Aq+|}ZlDaHL)K$O| z%9Jp-imI-Id0|(d5{v~w6mx)tUKfbuVD`xNt04Mry%M+jXzE>4(TBsx#&=@wT2Vh) z1yeEY&~17>0%P(eHP0HB^|7C+WJxQBTG$uyOWY@iDloRIb-Cf!p<{WQHR!422#F34 zG`v|#CJ^G}y9U*7jgTlD{D&y$Iv{6&PYG>{Ixg$pGk?lWrE#PJ8KunQC@}^6OP!|< zS;}p3to{S|uZz%kKe|;A0bL0XxPB&Q{J(9PyX`+Kr`k~r2}yP^ND{8!v7Q1&vtk& z2Y}l@J@{|2`oA%sxvM9i0V+8IXrZ4;tey)d;LZI70Kbim<4=WoTPZy=Yd|34v#$Kh zx|#YJ8s`J>W&jt#GcMpx84w2Z3ur-rK7gf-p5cE)=w1R2*|0mj12hvapuUWM0b~dG zMg9p8FmAZI@i{q~0@QuY44&mMUNXd7z>U58shA3o`p5eVLpq>+{(<3->DWuSFVZwC zxd50Uz(w~LxC4}bgag#q#NNokK@yNc+Q|Ap!u>Ddy+df>v;j@I12CDNN9do+0^n8p zMQs7X#+FVF0C5muGfN{r0|Nkql%BQT|K(DDNdR2pzM=_ea5+GO|J67`05AV92t@4l z0Qno0078PIHdaQGHZ~Scw!dzgqjK~3B7kf>BcP__&lLyU(cu3B^uLo%{j|Mb0NR)tkeT7Hcwp4O# z)yzu>cvG(d9~0a^)eZ;;%3ksk@F&1eEBje~ zW+-_s)&RgiweQc!otF>4%vbXKaOU41{!hw?|2`Ld3I8$&#WOsq>EG)1ANb!{N4z9@ zsU!bPG-~-bqCeIDzo^Q;gnucB{tRzm{ZH^Orphm2U+REA!*<*J6YQV83@&xoDl%#wnl5qcBqCcAF-vX5{30}(oJrnSH z{RY85hylK2dMOh2%oO1J8%)0?8TOL%rS8)+CsDv}aQ>4D)Jv+DLK)9gI^n-T^$)Tc zFPUD75qJm!Y-KBqj;JP4dV4 z`X{lGmn<)1IGz330}s}Jrjtf{(lnuuNHe5(ezA(pYa=1|Ff-LhPFK8 zyJh_b{yzu0yll6ZkpRzRjezyYivjyjW7QwO;@6X`m;2Apn2EK2!~7S}-*=;5*7K$B z`x(=!^?zgj(-`&ApZJXI09aDLXaT@<;CH=?fBOY5d|b~wBA@@p^K#nxr`)?i?SqTupI_PJ(A3cx`z~9mX_*)>L F{|7XC?P&l2 diff --git a/1.hello-world/14.read-video-webview/android/gradle/wrapper/gradle-wrapper.properties b/1.hello-world/14.read-video-webview/android/gradle/wrapper/gradle-wrapper.properties index 3f0f77b5..dea1f353 100644 --- a/1.hello-world/14.read-video-webview/android/gradle/wrapper/gradle-wrapper.properties +++ b/1.hello-world/14.read-video-webview/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jun 13 16:23:19 CST 2022 +#Thu Apr 13 17:46:19 CST 2023 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/1.hello-world/14.read-video-webview/android/settings.gradle b/1.hello-world/14.read-video-webview/android/settings.gradle index 0d014554..e5f9d85d 100644 --- a/1.hello-world/14.read-video-webview/android/settings.gradle +++ b/1.hello-world/14.read-video-webview/android/settings.gradle @@ -1,2 +1,16 @@ -rootProject.name = "ReadVideoWebView" +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "Dynamsoft Barcode" include ':app' From c48a6616d8b8a33cc6c3debc045f6b00e7aedd51 Mon Sep 17 00:00:00 2001 From: Keillion <735699921@qq.com> Date: Tue, 18 Apr 2023 15:10:17 +0800 Subject: [PATCH 2/8] Update MainActivity.kt --- .../src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt b/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt index 3f4dc52f..8ecaf703 100644 --- a/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt +++ b/1.hello-world/14.read-video-webview/android/app/src/main/java/com/dynamsoft/dbrjswebview/MainActivity.kt @@ -6,7 +6,6 @@ import android.content.pm.PackageManager import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.util.Log import android.webkit.* import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresApi @@ -24,8 +23,6 @@ class MainActivity : AppCompatActivity() { myWebView.settings.javaScriptEnabled = true myWebView.settings.mediaPlaybackRequiresUserGesture = false myWebView.settings.domStorageEnabled = true - Log.d("keillion Debug", "`myWebView.settings.cacheMode` default value: " + myWebView.settings.cacheMode.toString()) - myWebView.settings.cacheMode = WebSettings.LOAD_DEFAULT myWebView.webViewClient = MyWebViewClient() myWebView.webChromeClient = MyWebChromeClient() From d46e1d15f3ab87b5dd4541f7486faa0b3d845d0e Mon Sep 17 00:00:00 2001 From: Cube <877211593@qq.com> Date: Tue, 18 Apr 2023 17:27:58 +0800 Subject: [PATCH 3/8] update version to 9.6.20 --- 1.hello-world/1.hello-world.html | 4 ++-- 1.hello-world/10.read-video-pwa/README.md | 4 ++-- 1.hello-world/10.read-video-pwa/helloworld-pwa.html | 4 ++-- 1.hello-world/10.read-video-pwa/service-worker.js | 2 +- 1.hello-world/11.read-video-requirejs.html | 6 +++--- 1.hello-world/12.read-video-es6.html | 6 +++--- 1.hello-world/13.read-video-react-hooks/package.json | 2 +- 1.hello-world/13.read-video-react-hooks/src/dbr.ts | 4 ++-- .../android/app/src/main/assets/decodeBarcodeInVideo.html | 4 ++-- .../ios/ReadVideoWKWebview/html/index.html | 4 ++-- 1.hello-world/2.read-an-image.html | 4 ++-- 1.hello-world/3.read-video-angular/package.json | 2 +- 1.hello-world/3.read-video-angular/src/app/dbr.ts | 4 ++-- 1.hello-world/4.read-video-react/package.json | 2 +- 1.hello-world/4.read-video-react/src/dbr.ts | 4 ++-- 1.hello-world/5.read-video-vue/package.json | 2 +- 1.hello-world/5.read-video-vue/src/dbr.js | 4 ++-- 1.hello-world/6.read-video-vue3/package.json | 2 +- 1.hello-world/6.read-video-vue3/src/dbr.ts | 4 ++-- 1.hello-world/7.read-video-nextjs/dbr.ts | 4 ++-- 1.hello-world/7.read-video-nextjs/package.json | 2 +- 1.hello-world/8.read-video-nuxtjs/dbr.ts | 4 ++-- 1.hello-world/8.read-video-nuxtjs/package.json | 2 +- 1.hello-world/9.read-video-electron/README.md | 2 +- 1.hello-world/9.read-video-electron/action.js | 2 +- 1.hello-world/9.read-video-electron/package.json | 2 +- 2.ui-tweaking/1.read-video-show-result.html | 4 ++-- 2.ui-tweaking/2.read-video-no-extra-control.html | 4 ++-- 2.ui-tweaking/3.read-video-with-external-control.html | 4 ++-- 2.ui-tweaking/4.difference-video-size.html | 4 ++-- 2.ui-tweaking/5.read-video-with-custom-default-ui.html | 4 ++-- 3.settings/1.barcodeFormats-expectedBarcodes.html | 2 +- 3.settings/2.localizationModes-binarizationModes.html | 2 +- 3.settings/3.blurred-small-barcodes.html | 2 +- 3.settings/4.deformed-incomplete-barcodes.html | 2 +- 3.settings/5.regionOfInterest-regionPredetection.html | 2 +- 3.settings/6.dense-barcodes.html | 4 ++-- 3.settings/initScanner.js | 2 +- 4.use-case/1.fill-a-form-with-barcode-reading.html | 4 ++-- 4.use-case/2.read-a-drivers-license.html | 4 ++-- 4.use-case/3.highlight-results-with-custom-style.html | 4 ++-- 5.others/debug/public/index.html | 4 ++-- 42 files changed, 69 insertions(+), 69 deletions(-) diff --git a/1.hello-world/1.hello-world.html b/1.hello-world/1.hello-world.html index 18880cac..a95ea01b 100644 --- a/1.hello-world/1.hello-world.html +++ b/1.hello-world/1.hello-world.html @@ -12,7 +12,7 @@ Loading... - + + + + + + + + + + + + diff --git a/3.settings/2.localizationModes-binarizationModes.html b/3.settings/2.localizationModes-binarizationModes.html index a3bf86a0..a99983a6 100644 --- a/3.settings/2.localizationModes-binarizationModes.html +++ b/3.settings/2.localizationModes-binarizationModes.html @@ -13,7 +13,7 @@ library offline. Please see the guide on how to host the library: https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=latest#host-the-library-yourself-recommended --> - + diff --git a/3.settings/3.blurred-small-barcodes.html b/3.settings/3.blurred-small-barcodes.html index f50f62ff..0733267e 100644 --- a/3.settings/3.blurred-small-barcodes.html +++ b/3.settings/3.blurred-small-barcodes.html @@ -13,7 +13,7 @@ library offline. Please see the guide on how to host the library: https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=latest#host-the-library-yourself-recommended --> - + diff --git a/3.settings/4.deformed-incomplete-barcodes.html b/3.settings/4.deformed-incomplete-barcodes.html index b3fc5975..de2be8b9 100644 --- a/3.settings/4.deformed-incomplete-barcodes.html +++ b/3.settings/4.deformed-incomplete-barcodes.html @@ -13,7 +13,7 @@ library offline. Please see the guide on how to host the library: https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=latest#host-the-library-yourself-recommended --> - + diff --git a/3.settings/5.regionOfInterest-regionPredetection.html b/3.settings/5.regionOfInterest-regionPredetection.html index af2d792e..62aa055d 100644 --- a/3.settings/5.regionOfInterest-regionPredetection.html +++ b/3.settings/5.regionOfInterest-regionPredetection.html @@ -13,7 +13,7 @@ library offline. Please see the guide on how to host the library: https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=latest#host-the-library-yourself-recommended --> - + diff --git a/3.settings/6.dense-barcodes.html b/3.settings/6.dense-barcodes.html index 861997b7..109cf15f 100644 --- a/3.settings/6.dense-barcodes.html +++ b/3.settings/6.dense-barcodes.html @@ -18,7 +18,7 @@ library offline. Please see the guide on how to host the library: https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=latest#host-the-library-yourself-recommended --> - +

@@ -43,7 +43,7 @@ /** * You can visit https://www.dynamsoft.com/customer/license/trialLicense?utm_source=github&product=dbr&package=js to get your own trial license good for 30 days. * Note that if you downloaded this sample from Dynamsoft while logged in, the above license key may already be your own 30-day trial license. - * For more information, see https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=9.6.11&utm_source=github#specify-the-license or contact support@dynamsoft.com. + * For more information, see https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=9.6.20&utm_source=github#specify-the-license or contact support@dynamsoft.com. * LICENSE ALERT - THE END */ diff --git a/3.settings/initScanner.js b/3.settings/initScanner.js index 22d319ff..41d05683 100644 --- a/3.settings/initScanner.js +++ b/3.settings/initScanner.js @@ -26,7 +26,7 @@ window.onload = async function () { /** * You can visit https://www.dynamsoft.com/customer/license/trialLicense?utm_source=github&product=dbr&package=js to get your own trial license good for 30 days. * Note that if you downloaded this sample from Dynamsoft while logged in, the above license key may already be your own 30-day trial license. - * For more information, see https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=9.6.11&utm_source=github#specify-the-license or contact support@dynamsoft.com. + * For more information, see https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=9.6.20&utm_source=github#specify-the-license or contact support@dynamsoft.com. * LICENSE ALERT - THE END */ diff --git a/4.use-case/1.fill-a-form-with-barcode-reading.html b/4.use-case/1.fill-a-form-with-barcode-reading.html index bb85573c..2618b279 100644 --- a/4.use-case/1.fill-a-form-with-barcode-reading.html +++ b/4.use-case/1.fill-a-form-with-barcode-reading.html @@ -13,7 +13,7 @@ library offline. Please see the guide on how to host the library: https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=latest#host-the-library-yourself-recommended --> - + @@ -42,7 +42,7 @@

Click each input box to fill in!

/** * You can visit https://www.dynamsoft.com/customer/license/trialLicense?utm_source=github&product=dbr&package=js to get your own trial license good for 30 days. * Note that if you downloaded this sample from Dynamsoft while logged in, the above license key may already be your own 30-day trial license. - * For more information, see https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=9.6.11&utm_source=github#specify-the-license or contact support@dynamsoft.com. + * For more information, see https://www.dynamsoft.com/barcode-reader/programming/javascript/user-guide/?ver=9.6.20&utm_source=github#specify-the-license or contact support@dynamsoft.com. * LICENSE ALERT - THE END */ diff --git a/4.use-case/2.read-a-drivers-license.html b/4.use-case/2.read-a-drivers-license.html index 0adb4e74..007dba99 100644 --- a/4.use-case/2.read-a-drivers-license.html +++ b/4.use-case/2.read-a-drivers-license.html @@ -44,7 +44,7 @@

Read A Driver's License Read A Driver's License Bool { - - if #available(iOS 15.0, *) { - let app = UINavigationBarAppearance() - app.configureWithOpaqueBackground() - app.titleTextAttributes = [ - NSAttributedString.Key.foregroundColor: UIColor.black - ] - app.backgroundColor = UIColor.white - - UINavigationBar.appearance().scrollEdgeAppearance = app - UINavigationBar.appearance().standardAppearance = app - - } - - // Override point for customization after application launch. - return true - } - -} - -extension UIResponder { - var parentViewController: UIViewController? { - return next as? UIViewController ?? next?.parentViewController - } -} diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Contents.json b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 79575b2e..00000000 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "Icon-Small@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "Icon-Small@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "Icon-40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "Icon-40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "Icon-60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "Icon-60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png deleted file mode 100644 index 96ea5d726aef8ea4cfd977b9e8c0a141ae581fdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3955 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 W*{qYYr-8@-0000P?0GB diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png deleted file mode 100644 index 8269f2e636e9263222e9152b669294986e7848e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 zcmV+z9p~bSP)715Db0ttBsd-Eoc$m=He?*4Jkey_Fm-rtQgo|*5<_pP<| z+H3FMT5GSp&-reuv(7qC0TuLB*^d|#-TTVXC0%1_XZdlv9Ni@{IeqbZySXX=DwAF} z6lGXSHLvFK>0s!jJQDPzE=iwco6D#Aqje)!hP)a%zAs*HHy78EqSq`C1PCc`d^!w0 z?EsRl93BUx)E_Z6-}KBrx{>qc|Cm>8x{83{qAi#1k1)?Mq&{pr(b0r?XJ zxeif_fQIxa%Bg{t(t$`n(Ab6S|U@EX0AUc{LY_iUTeeP?bZE`{jV$3=6i9`7E(#59ebR?z#5&(^yMFPiBOVG<4AhpI)eGz)2D+e6O zk%Yd+2y~pH%{K&{NPvQ&bAX1rrGaID>Dg|1G?-lfaXSv^u|;bc&}lhWKE9lr4KRk4 zSJ1u%zRFBz2@Fm4$v8$Hn36uu27w=4IpC!FD3!DQxHaj-5z!wc*n=zen!vYlD5Iv9C^p6vkPJfv*P(Hqz#@&kt^FQrp-0Z1Zvj%p9MU@}S^C>&5k4{eU+ zInYFhp`0d)ENP;-zG%Ji74W;1AyTx{oC4pYCu9XM*vJhXD4J|u2PaR1#>sQhCq*9D zPuwoXAkZl|0!T-Z`;Ss|b`b?Y6%<_AfD$@l*-SdRp$EKZQZw2_JcqBqIsq{qo{T2v ztj}7wqZCj-_4^b+*SyjdOkbLG&jZN7Z0yQOfhyuWAWQ6R0J0J@}uWJ!$~1Dn0qie0INwa-1vx96o#)Yu7%DhaUP4 ze*W`cVsvyg^G9y!AGnSE$8xD3s!2ak>z0?6=`@pRIez5Iso0PFhTg0{%4tV`F5wwt zI~^=qbTSq#IvMNNug9Htei6?umZgc{cC1&s6i`+ z4n$)qaR7!##Dky@-WMK7sy~`vvymILOh>MzrJ_$?RAh&AitqAzdU|lvO&`XIC%#pf z90`Pw-VJD!^D})QhbP$(^C9p%S|F!d_GNvVm2JBSiYTBdl6LOg6^_!odV6~@b?OvM zm@t7X(A=U-)5nb)hg)wQ#C6ww5W~a6t)`4^6-UonhdKGSO(bvWjs1l@&t{*mbdjZ8 zUc>2lq5*h-1T?)>(w&A;2msr+zksW*x`wPiU0P314`$AsiBnElgmce52dABODyh%? zeC)BaamgjiuxiyqMS$8#@h7@yTSWq6>8QM!Bl;-dc{cleYTH!jths=jqJ3JlJ}doi zl#iMYs|rb%{ABIH^2EUsnd<<%Pw1vo}M~L zd0hG|N!y0v%mq!S)_Qd=fPR%rrZd<1T4JRnFHj<@^BSQmXz2<8SMpXfuH*dk< z;O$ts@*a$ij?_a^2RxY&eh@d@cL+uiuBe?_Sx`>3-hzu6Mdt8Xf1H^BydiKcDE2u>%2}iOwWF z;AMe{93C=wib&Bc&=UCmWQNr*cf}DV>ji-O?|%@#{N=BrwOGGSIc0I1W$YjUpuc}A zKKC!5#c8L#4gADWj^*o#>5hHbpe4YRqB6k?fzC+L6itqDZr>~E&Al@P0AKmazhQKA z)ay^bX3zdJ^!4?{5vqX6lPBYjJ3fhzeB=hqm@z$?oX{zJIv6?uCgT_!y=;9h+gsZz zS`ig=%V?@HZd>G6)(zcmVW`XKC8}_0yB1czTeoh-+O^N(q?1mJbk}u_x4h*oc>ehf zp1rEItJCS=(o5fqODQIDE#RT|_tdVy< z`yhnI%Z}m?h_K7)Lx1mdI^HN%ARo2$q-Y>~ItPN}6cjiqFs-h92k?2#{a|~RW)*@t zo&>~n-lPdSb!vGp?dtXky`BwK^MzXqs>(gmQyyL0;5zIUwZ~BOeW=9b-JiNLOtJ$re!v=o0vrF5RrB3#Qmw zD@M`iHMmLBfvmF8&OJCFfsqZIpo4UlYc>>8UN zxj7ZP|J~P1T0*YNw)@`R4h9DLF=_H7!0dnXBGI4hKsVy?QQ+j!Z684_08r?(RZKMK zoPrCg@gHw}Rv;(N)00)P69t~3W%lDQU{OKl)0%%fonD-O{<*m5q6@KL!F-G#KOUo_ zqu96aMf~Cy|BF?t9>T7jyMW*T#(!{tUx)oUuyh4rT<QEz{Zp}f_a1E8v?b8P z>9@MV!;tooowzWffHtxXBc_YRm9LxH7O`jH1o&C~v~N{K-Sh~*H&2Cp>|_6cg$ox% zx@OLtfy*y{AC@j%g1hee5`Or@|0cIp&9Gv+3+Sv_voLMi0M@K|7FE?8n_hO=rC7fF zy%-o6FuQ>ZE?6q+;eqzfqV0g$qJ>?bsY$ayOScQHjvT$_Es%!SPh1r{?IBgrz}&gV zVa1Bili<2nUtb?S`qA5P@x>R(DHlFnn}5a`@4$)`pU2D@GXMbn{r&jd=kCC@*It8Z z)24ZICl`5vex_epg+th%l(s8cXH28EV2b=aX;L3P{pn9& zU|=B9LtS-UDm?u+aygdPuu>#{wt*;uGq~0i8YhEUFbG;vy^nluwegXc}0>5pD}-50G_MYe?BckSAZ!NFT`_SqL=$&yR3 z;!Ahq_19k~$Du#J?|qjF>u@|5`dYSZsR5loGf)9=j&5O{cjarUBBcRUiKz4K;7*L( zch_KU9hEW#5Vs5Ww0hKvu*;Qw`Q?{!!wom$@yCA)0C?q&CZenP z_rw$b5;JGcu#+1)CY50TOqnt{+NyD~RwWV50iY_7uOonrI7jEeXuzicptdAqt=IuY zP7H0YqaXff-R|zYS7OJGosm;L`P9=`x$>Ua&i3EBu5rd0Z?}EHz7gh-X&-1F4gTzB z{~61dUxBmFz5thB{(dJj2JV8Re7B5~zPOj9aSx%I~z4!hnuD$l}@yH`T!v6jHQB^he?%fy8iZc)S zbnk{gH|b`=GS_EUPn6mS;gZPJ5vH8Baq3i_to=@>*(aWO0>i_HNT-5oep9t-)kAE0 zKjDOhVfeE1;I>st;R|0_fqTF99~c=K4N|eS!3WN_Ek&;-fcU~H1Vb5l$#Z?(Wq^jV z`l5=TSg$O*dGl7*2HpPAM}G{Z6xq))#~g#B`i^q?vO2f|4FG=flb_;S-};WfH6(P{ zdGP5fMThw_O3Zpux()}$g~uyR#qN5^%F;)WlvB9!;X1f~|9-@i=}+*!efzLs!$xx5 zuc`_&+LI|ehIU4n2p$<3F>Ct~12m*7FGbrZ%5-9z zq!K`Llb(v$6pzXZtZr5_l{wGG$7XUWF;Znl)?P9y}Y;fV%e5 zbgiS)96##wPG_)aK#q>L>b+$~c|i9cx?`fY<+RR3MV2ccdpI%5 zyt`F~?)S?@zvhjMjCft?!Mb+&H#?M(l^*zeDM~kW4^|Tnl*_!N%F^us6Xu}K=Y$EYK#Ez^2-OD_I{>d z`*mdfrV`yYRe`KgX&Z6Hfzi?K?$y(&n3ru$6`v;Q5W5NJII9$~6=KtB zL$}Tu|7|N@9#IPQ>0k@7cfb2g%$hYT>IVScc;gNH{`W&I-A;tjtnuT=+x`&RYu<3u$tRLy*t2I3UU}tJGDU}%-leP(ZN3$AQoSHoz6U~6n%SzFig_}zsH*Oq0^{Ict?Af!~J|27QaW|0K{&axS zZJNK=VP&bR_Lw)n8T04QBXz7>_dIl`P3D7%Bz7*GY?uFcx-(@R8-m+~%0?|=5g)ZK zFODiUlG)4$FWCM>55h=2=gpJXd+ql~cI&4@|}K z<$r^#uf7UXrcB`rB>=zs-4ocdWov9}RRM^zhWd_?y}iAdHf;dMA3qnTo%S}o{q3h?;>3y0X;B>Ans?7VU!&7M5q06I)(1a$9d5q) zwy2V?>l(M;ehUT$2FLfaApox7j7nSK^t7&PY zg_;!i`C#s1Pn(!)=gwXD)Fd1fspP3ptq#f#9_ z*T>p&;J^WV``h1ZZEkv{wr1pI*36t}jH9`+Ii1dlHCT$+mY-OIsgy`v@-4eK9a5k7 z?|%s&`p`|-_u`A~P{Z}SaX#0sP}k0#yD)QR^F+q1S+mR@o3l~VzWUXF$H9XKqa#T7 z*A!e^70Gr{ElcZj3w~`JDY~4Bn&9)*cK(%efKVpt1>663~=^Y*&?_U*$rzVQI=yYB%U zithbVldQ01%N9KH$dAZ57#iAP+RK2(dZ`;B?D{-^-dhzv@%%p5@G~n^Ry)%^N^K1> zTaP49@!juJr%b`3#V6zFqu+$#;bCmux((~rt;fiS{S(II_NTN@a*XE9kt1lCvemqK zZ&i$}r>=XTd7cO`%M1Mf%77a)piP4^ z9n@AQXRAcWTHLKH`2%npJDEU}S0Z9j&f^?FO!cLXL2Ye}JO@&NY)<47fcml!WnG}{ zNmdTf6vwaBM_mi4leRsy_~EBzAtM}vJkZi%}PgeY@^R7 z+qX_s>>zUS#sN|007oD~jgAaJld^J@Q+oYh7sh(R?(<|4j!>TRQ)!z54c$8cK`#e1 z)KTCpY~%vrfOw!ATJ*@ykpg;b6*a$gDlV$JaR3oeMh~H**jX~uHk+amM>$bN!w4N2 zpvhn{T(PYPCf%;oIZ7RXl|K^EPXU^g^#Ki|yaqE-t~U^wA(G>PZ24n~c8XVCY*~Fm zq!-Y0(>x23rWeVUMR{$Sk`N$U=q;Xq;#%LS81Dx+{m8%bWQ=<$QC$-a{lMD zYyj;?Rxaf*$+Rvy0iP+#*ZkDFT^L=_1oLS-JDoexn3P2TKw@-9LC+VDif?l%bO4V{GtJ@P*w1aOVnvp4&EYva_MdV3fa#1TqI!BKH z%?FO7vmhCIr~|PM0et2xI*70ofEjY#ufHvy0Y$eh<)zl=A_wTEuwp@?Y{_&A0tjZC zuhncRT#B^-~eLU&W%vXDMDE;a$$7TGH|9z(3qE1E{J21 zp|hNAFFFa$ld?q80l4&>owhlU_~?)6THk(zb}Nv6#TU8VIz z+U_#a$;oAGU<)fD%~KtZHTBnkeF!8S%|?~QHzRE)K?FH>MrLdgD>#7$GdnuDNT;_| z06poJ9?}@_x>@6)Q#AZBrX$Z)m6x`2K$N2u@S>8M;G`1>DVT|NHaZI(fCnR?C+t@O zI#8mWg)OquY1kJ?r}=ykB^kYbC)a0=E3UOnt8NRlh|T~fq;0+s3u!dai7MK)EG3W| z{YQ3vmOv@5#=Bgfg)}_YgAYRwBa~SdEYQs*0_>%2?*k{@W!jcNOv=cqzw08cxT*&4 z9HL{;dRX8J(mALU9X^e#sLusyI}LP7&H|kk%~VvTfGz~n^78eSZ?`x=^P^vZ`jh^Y z&0)vhhoqzcPMKT^sFWi}?bB;F!x0=nbegf!#jTR1i78t8Rf-3+c;%$pGPzX5CnL5C zz;Yrz)R|hhOV?q3tHksR2jCD)a{$8d-A)YJ84-PCfX~v11=!_o>l9!jZbE6rO ztW}hf%TCM1X&Y=?1s+T>rE}>ypAzZV15wbIlHtK>`CX>%V$fIz;GL}`o&P_S W*{qYYr-8@-0000P?0GB diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png deleted file mode 100644 index 711fb80a96fa15e0fe3e25b7ad9e9691f301be2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14295 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 diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png deleted file mode 100644 index 00a479aab8784a4a835104d8531d5f395bdad0d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2458 zcmV;L31#+)P)2A6DYfcSzSt5Yor^+gi7iRrwl9GWXwN>p&%MvNf1l?qeG+)j zz4zQdzjJ=)-19sj+S|7hARqw9zl1>i1Z1wyWB}ed=9u0#^}~IYJ`oWBA`l2f06-w} z$w*|b&t$0w$9!{4Z=3qO4^|(Wlntm25&@Yq=$POGW6pM>&)YW(IEo$W0mH3cne1YO z7~rfya`N2%V+ z7_)vlhrq+uOQCZpenWJ&s7oAhfXVt;5>Xbb8Y;h&d;!6r>%$*{Gd4eqG>iB7UWgM%^^JW(8?^ zJ%gMnewFtsk6%XJ_?I%oWC}=cY-W*z;B9)F^!3GWo`@hs*?Iy1#f|ch08o~9?AU?2 zrAw`PT0j5-n4O)))YKHd`|cdhpC4w15fFmnwNQb~<^ll8;@;4cV*p^a6a9QLkpK@! zB7tX~*@Z%(fV78*Fgkh>Z@qOKCr^F^zP?;bplsE!93Nbh6Y%A|8~`Oaqn(+$TuStu5Zn4T^v&`}hjp`jj& z7cW*i0PxU5TXF8(c^o@-TzRa#q)EvDZJiW$cvQ`o0F(6qAkRJFrmkQXDnD<&`41dF z{!b(?#R5?jp{3<#*uDGLxbMDA3h>iUKZ$qWeGivQmvxXZh(w zQU34@3?j_U&Ec!B266CUCr+GrN9onn)L_e&Hbt?!?`}%X+UYXbTq%dBPO@NNAi+1* zL8`WK&6smuef6)nc=4i|+tSjk4zX+36X@)G4u!%U%wiS9X@>h3mL3rKLE1@12vMf8 zb3Ez0apO9Adp}q7Ei^VVFu)^^Y{wgKypDqh_v?vC^H3H!Yx0sFO#$hqZa7mpECC0C5Ku9^?{KvD*o)87SNr>+O2 z?NJ8AVOO#3_^z?ibEFtp*0til!aYLHPidR1Fs-$!p%L6CCz=_%_z!a=gwbY<;nv3`o6%CBY#9~Z7sg}W(Yk! zAI7=KC?r520sS7e>8i_K>RL%mdeBW>+27I8u7Q;Ox82r&XMeX>qw}6UyYcqh$FP6@ zJ~T8m;PBx;V9Amt@%lDZ&G=QxC|Ecc2ThAlm*EWh_|*wCbs7~h|W z(B1tP^z?if_XF`~1NS?xAiJm!-J@C|pm{R;8oYmUa#FKC5uv~Tw32VXeT5q5^F~HS z@xcctHIISI*4--q*)ZjR=KZIGw+&(H%GhwPqtE~T`}0btu8xRG&kR) z#>U3RnL*5T$_JP8>+654#*4+G8t41VHF)CjeFBnl#4R19u;Y>5_`+ZCT~Pb%tiOUH0++EQ{jtr(AoILHScxF4^)@-lKU z1p(mHsn48=X#M)Tn5PL#mM%qW+h(PA=FHccp?#HBl7s@(P42t+j*CA?Ym`(LEcb2P z*o?;?e=Hs^e+68zVmaE{TG7>hu3SM|TPs$tUajVjjg8~A*ZyWPfSpv!)H1$9 znK-XH)i+ufg$2gPFCm|=k_NV(8#iWAEEe(YxBtbbpZ22fv(GVS(w~50aS}iLFa`h^ z9=?DRC*DC<*Pl>ZTMGaf96W==hhIRkIH|o87mGzTZ)$2<%lba*@>fW4*SdR%GgAUI zJ>?$P|5ul*Cicp)#RP!5Wp!A)b`6TfNemBP$Tm;z#VnuHys*Z_x^+L5{tNRRr zyfj%qO?%2Q;WXj~}*RCd|>y~+}rH?yaJji$-H4~CILAii< z%f|H5GCN4S^t8uygUD1GY2NgB(CtyrnBm1NV9bO2J!yM22$E&uNCRWi*D!z!pv$B4 z1+M|CgxU^}rV%0&oRhu*fI(0x;JqF4lK2gQ z)TqmVIl*~6ZUJ<7bfM$7l1ywa*M*GVbVJN1e&ehQxB!n(0M-bs~aT@%#>4sYB(#Qvj>m`(2=bdio#s} YKP)d|Of>w|wEzGB07*qoM6N<$f;A!DWdHyG diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png deleted file mode 100644 index fcce1d88755f7efba4fde1f7c523f1a5195e1d88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4393 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 diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/DBRWKWebViewHelper.swift b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/DBRWKWebViewHelper.swift deleted file mode 100644 index 0802aa6c..00000000 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/DBRWKWebViewHelper.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// MainScanner.swift -// ReadVideoWKWebview -// -// Created by Dynamsoft on 2022/3/5. -// - -import WebKit - -class DBRWKWebViewHelper: NSObject { - - var wkWebView: WKWebView? - - func pollute(_ _wkWebView: WKWebView) { - wkWebView = _wkWebView - - let configuration = _wkWebView.configuration - let preferences = WKPreferences() - preferences.javaScriptEnabled = true - preferences.javaScriptCanOpenWindowsAutomatically = true - configuration.preferences = preferences - - let userContentController = configuration.userContentController - userContentController.add(self, name: "onWasmLoaded") - userContentController.add(self, name: "onUniqueRead") - wkWebView!.configuration.userContentController = userContentController - } - - func startScanner() { - wkWebView!.evaluateJavaScript("startScanner()") - } - - func stopScanner() { - wkWebView!.evaluateJavaScript("stopScanner()") - } -} - -extension DBRWKWebViewHelper: WKScriptMessageHandler { - // handle calls from JS here - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - switch message.name { - case "onWasmLoaded": - ViewController.showController(wkWebView!.parentViewController.self! as! ViewController)() - case "onUniqueRead": - ViewController.showResult(wkWebView!.parentViewController.self! as! ViewController)(message.body as! String) - default: - print(message.body) - } - } - -} diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Info.plist b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Info.plist deleted file mode 100644 index 41dd3cf1..00000000 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSCameraUsageDescription - ReadVideoWKWebview needs to access your camera. - UIApplicationSupportsIndirectInputEvents - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/ViewController.swift b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/ViewController.swift deleted file mode 100644 index ecd1e385..00000000 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/ViewController.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// ViewController.swift -// -// - -import UIKit -import WebKit - -class ViewController: UIViewController { - - var myButton: UIButton? - var wkWebView: WKWebView? - var dbrWKWebViewHelper: DBRWKWebViewHelper? - - override func viewDidLoad() { - - super.viewDidLoad() - - wkWebView = WKWebView(frame: self.view.frame) - myButton = UIButton(type: .system) - myButton!.setTitle("Start Scanning", for: .normal) - myButton!.setTitleColor(.white, for: .normal) - myButton!.isHidden = true - myButton!.frame = CGRect(x: (self.view.bounds.width - 150) / 2, y: self.view.bounds.height - 200, width: 150, height: 50) - myButton!.backgroundColor = UIColor(red: 0.4, green: 0.2, blue: 0.5, alpha: 1) - myButton!.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside) - - self.view.addSubview(wkWebView!) - self.view.addSubview(myButton!) - // pollute your WKUserContentController - dbrWKWebViewHelper = DBRWKWebViewHelper() - dbrWKWebViewHelper!.pollute(wkWebView!) - - let fileURL = Bundle.main.url(forResource: "html/index", withExtension: "html" ) - wkWebView!.loadFileURL(fileURL!,allowingReadAccessTo:Bundle.main.bundleURL); - } - - @objc func buttonClicked() { - let title = myButton!.title(for: .normal) - if (title == "Start Scanning") { - myButton!.setTitle("Stop Scanning", for: .normal) - dbrWKWebViewHelper!.startScanner() - } else { - myButton!.setTitle("Start Scanning", for: .normal) - dbrWKWebViewHelper!.stopScanner() - } - } - - func showController() { - let alertController = UIAlertController(title: "Wasm loaded!", message: nil, preferredStyle: .alert) - self.present(alertController, animated: true, completion: nil) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2.0) { - alertController.dismiss(animated: true, completion: nil) - } - myButton!.isHidden = false - } - - func showResult(_ result: String) { - let alertController = UIAlertController(title: "Result: ", message: result, preferredStyle: .alert) - let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) - alertController.addAction(cancelAction) - self.present(alertController, animated: true, completion: nil) - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - } - -} diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html deleted file mode 100644 index b202b27f..00000000 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - Dynamsoft Barcode Reader Sample - Read Video WKWebView(iOS) - - - -
- -
-
-
-
- - - - - diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.pbxproj b/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.pbxproj new file mode 100644 index 00000000..7f7ce301 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.pbxproj @@ -0,0 +1,373 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 68309E9F29F28D950016A358 /* html in Resources */ = {isa = PBXBuildFile; fileRef = 68309E9E29F28D950016A358 /* html */; }; + 68A0A94529EE855E00DC7D57 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A0A94429EE855E00DC7D57 /* AppDelegate.swift */; }; + 68A0A94729EE855E00DC7D57 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A0A94629EE855E00DC7D57 /* SceneDelegate.swift */; }; + 68A0A94929EE855E00DC7D57 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A0A94829EE855E00DC7D57 /* ViewController.swift */; }; + 68A0A94C29EE855E00DC7D57 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 68A0A94A29EE855E00DC7D57 /* Main.storyboard */; }; + 68A0A94E29EE856100DC7D57 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 68A0A94D29EE856100DC7D57 /* Assets.xcassets */; }; + 68A0A95129EE856100DC7D57 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 68A0A94F29EE856100DC7D57 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 68309E9E29F28D950016A358 /* html */ = {isa = PBXFileReference; lastKnownFileType = folder; path = html; sourceTree = ""; }; + 68A0A94129EE855E00DC7D57 /* dbrjswebview.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dbrjswebview.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 68A0A94429EE855E00DC7D57 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 68A0A94629EE855E00DC7D57 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 68A0A94829EE855E00DC7D57 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 68A0A94B29EE855E00DC7D57 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 68A0A94D29EE856100DC7D57 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 68A0A95029EE856100DC7D57 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 68A0A95229EE856100DC7D57 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 68A0A93E29EE855E00DC7D57 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 68A0A93829EE855E00DC7D57 = { + isa = PBXGroup; + children = ( + 68A0A94329EE855E00DC7D57 /* dbrjswebview */, + 68A0A94229EE855E00DC7D57 /* Products */, + ); + sourceTree = ""; + }; + 68A0A94229EE855E00DC7D57 /* Products */ = { + isa = PBXGroup; + children = ( + 68A0A94129EE855E00DC7D57 /* dbrjswebview.app */, + ); + name = Products; + sourceTree = ""; + }; + 68A0A94329EE855E00DC7D57 /* dbrjswebview */ = { + isa = PBXGroup; + children = ( + 68309E9E29F28D950016A358 /* html */, + 68A0A94429EE855E00DC7D57 /* AppDelegate.swift */, + 68A0A94629EE855E00DC7D57 /* SceneDelegate.swift */, + 68A0A94829EE855E00DC7D57 /* ViewController.swift */, + 68A0A94A29EE855E00DC7D57 /* Main.storyboard */, + 68A0A94D29EE856100DC7D57 /* Assets.xcassets */, + 68A0A94F29EE856100DC7D57 /* LaunchScreen.storyboard */, + 68A0A95229EE856100DC7D57 /* Info.plist */, + ); + path = dbrjswebview; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 68A0A94029EE855E00DC7D57 /* dbrjswebview */ = { + isa = PBXNativeTarget; + buildConfigurationList = 68A0A95529EE856100DC7D57 /* Build configuration list for PBXNativeTarget "dbrjswebview" */; + buildPhases = ( + 68A0A93D29EE855E00DC7D57 /* Sources */, + 68A0A93E29EE855E00DC7D57 /* Frameworks */, + 68A0A93F29EE855E00DC7D57 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = dbrjswebview; + productName = dbrjswebview; + productReference = 68A0A94129EE855E00DC7D57 /* dbrjswebview.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 68A0A93929EE855E00DC7D57 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1400; + LastUpgradeCheck = 1400; + TargetAttributes = { + 68A0A94029EE855E00DC7D57 = { + CreatedOnToolsVersion = 14.0.1; + }; + }; + }; + buildConfigurationList = 68A0A93C29EE855E00DC7D57 /* Build configuration list for PBXProject "dbrjswebview" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 68A0A93829EE855E00DC7D57; + productRefGroup = 68A0A94229EE855E00DC7D57 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 68A0A94029EE855E00DC7D57 /* dbrjswebview */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 68A0A93F29EE855E00DC7D57 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 68A0A95129EE856100DC7D57 /* LaunchScreen.storyboard in Resources */, + 68309E9F29F28D950016A358 /* html in Resources */, + 68A0A94E29EE856100DC7D57 /* Assets.xcassets in Resources */, + 68A0A94C29EE855E00DC7D57 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 68A0A93D29EE855E00DC7D57 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 68A0A94929EE855E00DC7D57 /* ViewController.swift in Sources */, + 68A0A94529EE855E00DC7D57 /* AppDelegate.swift in Sources */, + 68A0A94729EE855E00DC7D57 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 68A0A94A29EE855E00DC7D57 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 68A0A94B29EE855E00DC7D57 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 68A0A94F29EE856100DC7D57 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 68A0A95029EE856100DC7D57 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 68A0A95329EE856100DC7D57 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 68A0A95429EE856100DC7D57 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 68A0A95629EE856100DC7D57 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = KK22Q4GV82; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = dbrjswebview/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = DyBarcode; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dynamsoft.dbrjswebview; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 68A0A95729EE856100DC7D57 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = KK22Q4GV82; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = dbrjswebview/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = DyBarcode; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dynamsoft.dbrjswebview; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 68A0A93C29EE855E00DC7D57 /* Build configuration list for PBXProject "dbrjswebview" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 68A0A95329EE856100DC7D57 /* Debug */, + 68A0A95429EE856100DC7D57 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 68A0A95529EE856100DC7D57 /* Build configuration list for PBXNativeTarget "dbrjswebview" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 68A0A95629EE856100DC7D57 /* Debug */, + 68A0A95729EE856100DC7D57 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 68A0A93929EE855E00DC7D57 /* Project object */; +} diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/AppDelegate.swift b/1.hello-world/14.read-video-webview/ios/dbrjswebview/AppDelegate.swift new file mode 100644 index 00000000..ad05d455 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// dbrjswebview +// +// Created by Dynamsoft on 2023/4/18. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/AccentColor.colorset/Contents.json b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..eb878970 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/AppIcon.appiconset/Contents.json b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..13613e3e --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/Contents.json b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/Contents.json similarity index 100% rename from 1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Assets.xcassets/Contents.json rename to 1.hello-world/14.read-video-webview/ios/dbrjswebview/Assets.xcassets/Contents.json diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Base.lproj/LaunchScreen.storyboard b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from 1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Base.lproj/LaunchScreen.storyboard rename to 1.hello-world/14.read-video-webview/ios/dbrjswebview/Base.lproj/LaunchScreen.storyboard diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Base.lproj/Main.storyboard b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Base.lproj/Main.storyboard similarity index 52% rename from 1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Base.lproj/Main.storyboard rename to 1.hello-world/14.read-video-webview/ios/dbrjswebview/Base.lproj/Main.storyboard index 9c0d7ec6..85dc8abf 100644 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/Base.lproj/Main.storyboard +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Base.lproj/Main.storyboard @@ -1,46 +1,28 @@ - + + + - - - - - - - - - - - - - - - - - - - - + - + - + - - + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/Info.plist b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Info.plist new file mode 100644 index 00000000..93bb4788 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/Info.plist @@ -0,0 +1,27 @@ + + + + + NSCameraUsageDescription + Decoding barcodes from video needs to access your camera. + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/SceneDelegate.swift b/1.hello-world/14.read-video-webview/ios/dbrjswebview/SceneDelegate.swift new file mode 100644 index 00000000..0860c7e6 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/SceneDelegate.swift @@ -0,0 +1,52 @@ +// +// SceneDelegate.swift +// dbrjswebview +// +// Created by Dynamsoft on 2023/4/18. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/ViewController.swift b/1.hello-world/14.read-video-webview/ios/dbrjswebview/ViewController.swift new file mode 100644 index 00000000..183e95bc --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/ViewController.swift @@ -0,0 +1,106 @@ +// +// ViewController.swift +// dbrjswebview +// +// Created by Dynamsoft on 2023/4/18. +// + +import UIKit +import WebKit + +// Refer: https://developer.apple.com/documentation/webkit/viewing_desktop_or_mobile_web_content_using_a_web_view +class ViewController: UIViewController, WKUIDelegate { + + let webView: WKWebView + + required init?(coder: NSCoder) { + print("entered init") + let configuration = WKWebViewConfiguration() + configuration.allowsInlineMediaPlayback = true + configuration.mediaTypesRequiringUserActionForPlayback = [] + // Refer: https://stackoverflow.com/a/51736967 + configuration.websiteDataStore = WKWebsiteDataStore.default() + webView = WKWebView(frame: .init(), configuration: configuration) + + super.init(coder: coder) + } + + // Refer: https://www.hackingwithswift.com/articles/112/the-ultimate-guide-to-wkwebview + override func loadView() { + self.view = webView + } + + override func viewDidLoad() { + super.viewDidLoad() + print("entered viewDidLoad") + // Do any additional setup after loading the view. + + // Refer: https://stackoverflow.com/a/40316507 + webView.uiDelegate = self + + //let url = URL(string: "https://your.online.website/target/page.html")! + //webView.load(URLRequest(url: url)) + + // load local html + let fileUrl = Bundle.main.url(forResource: "html/decodeFileInVideo", withExtension: "html")! + webView.loadFileURL(fileUrl, allowingReadAccessTo: fileUrl) + print("finish viewDidLoad") + } + + // Refer: https://stackoverflow.com/a/40316507 + + func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping () -> Void) { + + let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) + alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in + completionHandler() + })) + + present(alertController, animated: true, completion: nil) + } + + + func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (Bool) -> Void) { + + let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) + + alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in + completionHandler(true) + })) + + alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in + completionHandler(false) + })) + + present(alertController, animated: true, completion: nil) + } + + + func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (String?) -> Void) { + + let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet) + + alertController.addTextField { (textField) in + textField.text = defaultText + } + + alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in + if let text = alertController.textFields?.first?.text { + completionHandler(text) + } else { + completionHandler(defaultText) + } + })) + + alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in + completionHandler(nil) + })) + + present(alertController, animated: true, completion: nil) + } + +} + diff --git a/1.hello-world/14.read-video-webview/ios/dbrjswebview/html/decodeFileInVideo.html b/1.hello-world/14.read-video-webview/ios/dbrjswebview/html/decodeFileInVideo.html new file mode 100644 index 00000000..4d2f6d5c --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/dbrjswebview/html/decodeFileInVideo.html @@ -0,0 +1,71 @@ + + + + + + + + + + Dynamsoft Barcode Reader Sample - Hello World (Decoding via Camera) + + + +Loading... + + + + + From a8f5e9461d82f58737854f13d21e10cfd515618f Mon Sep 17 00:00:00 2001 From: Keillion <735699921@qq.com> Date: Fri, 21 Apr 2023 23:16:42 +0800 Subject: [PATCH 5/8] Delete index.html --- .../ios/ReadVideoWKWebview/html/index.html | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html diff --git a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html b/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html deleted file mode 100644 index abc32dc3..00000000 --- a/1.hello-world/14.read-video-webview/ios/ReadVideoWKWebview/html/index.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - Dynamsoft Barcode Reader Sample - Read Video WKWebView(iOS) - - - -
- -
-
-
-
- - - - - From 227a8efa84aa16589285e013a41107ddda2d30b9 Mon Sep 17 00:00:00 2001 From: Keillion <735699921@qq.com> Date: Fri, 21 Apr 2023 23:19:37 +0800 Subject: [PATCH 6/8] README need review after refactor --- .../14.read-video-webview/android/README.md | 100 ------------------ .../14.read-video-webview/ios/README.md | 99 ----------------- 2 files changed, 199 deletions(-) delete mode 100644 1.hello-world/14.read-video-webview/android/README.md delete mode 100644 1.hello-world/14.read-video-webview/ios/README.md diff --git a/1.hello-world/14.read-video-webview/android/README.md b/1.hello-world/14.read-video-webview/android/README.md deleted file mode 100644 index 2dbaa4d9..00000000 --- a/1.hello-world/14.read-video-webview/android/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# Hello-world for Android WebView - Dynamsoft Barcode Reader Sample - -This sample demonstrates how to use the [Dynamsoft Barcode Reader](https://www.dynamsoft.com/barcode-reader/overview/) JS Edition in Android. - -If you want to learn how to use the Android Edition SDK in javascript, you can check [Android WebView Barcode Scanning](https://github.com/Dynamsoft/barcode-reader-mobile-samples/tree/main/android/JavaScript/WebViewBarcodeScanning). - -## Get Started - -### 1. Get your web page ready - -Follow this [Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/?ver=latest#building-your-own-page) and build your page, including importing the SDK and initializing the certificate, etc. - -Then you can define some functions according to your needs, like the code below, we will use it later: - -```javascript -async function startScanner() { - let scanner = await Dynamsoft.DBR.BarcodeScanner.createInstance(); - await scanner.setUIElement(document.getElementById('div-ui-container')); - await scanner.show(); -} -``` - -Don't forget to load this page using webview in your Android project. - -### 2. Add DBRWebViewHelper - -Copy the file 'DBRWebViewHelper.java' in the sample to your Android project. - -This file provides a class: `DBRWebViewHelper`, which will make it very convenient to let the java code use DBR JS by providing some methods. - -```java -DBRWebViewHelper dbrWebViewHelper = new DBRWebViewHelper(); -``` - -### 3. Pollute your WebView - -Class `DBRWebViewHelper` provides a method `pollute`, which will inject a global variable `DBR_Android` into the javascript code in your WebView. - -```java -// public void pollute(WebView webview) -dbrWebViewHelper.pollute(mWebView); -``` - -The variable is an object that has some methods to communicate with native code, you can call them directly like this: - -```javascript -// e.g. callback after decoding, this will execute our corresponding java code in DBRWebViewHelper -scanner.onUniqueRead = (txt, result) => { - const format = result.barcodeFormatString; - window.DBR_Android.onUniqueRead(format + " " + txt) -}; -``` - -## Customize DBRWebViewHelper - -**Notice: when you change variables or methods, you should modify both native code and JS code to avoid errors.** - -### 1. Rename the variable to be injected - -The name is set in the method `pollute`, just change the string value. - -```java -mWebView.addJavascriptInterface(new WebAppInterface(), "e.g. DBR_Android"); -``` - -### 2. Change the methods to be injected - -All methods are defined in the `WebAppInterface` class in 'DBRWebViewHelper.java', you can add methods you need, or delete and modify them. - -```java -// e.g. -public class WebAppInterface { - WebAppInterface() {} - - @JavascriptInterface - public void onUniqueRead(String result) { - // your code here - } - @JavascriptInterface - public void onWasmLoaded() { - // your code here - } -} -``` - -### 3. Execute JS code - -`DBRWebViewHelper` has an `evaluateJavascript()` method, which executes javascript code through `WebView.evaluateJavascript()`, you can use it to complete the interaction like the following code. - -```java -public void startScanner() { - evaluateJavascript("startScanner()"); -} -``` - -Then, the following code will execute the function `startScanner()` we just defined in javascript code. - -```java -dbrWebViewHelper.startScanner(); -``` \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/ios/README.md b/1.hello-world/14.read-video-webview/ios/README.md deleted file mode 100644 index c72bd1df..00000000 --- a/1.hello-world/14.read-video-webview/ios/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# Hello-world for iOS WKWebView - Dynamsoft Barcode Reader Sample - -This sample demonstrates how to use the [Dynamsoft Barcode Reader](https://www.dynamsoft.com/barcode-reader/overview/) JS Edition in iOS(Swift). - -If you want to learn how to use the Android Edition SDK in javascript, you can check [iOS WebView Barcode Scanning](https://github.com/Dynamsoft/barcode-reader-mobile-samples/tree/main/ios/JavaScript/WebViewBarcodeScanning). - -## Get Started - -### 1. Get your web page ready - -Follow this [Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/?ver=latest#building-your-own-page) and build your page, including importing the SDK and initializing the certificate, etc. - -Then you can define some functions according to your needs, like the code below, we will use it later: - -```javascript -async function startScanner() { - let scanner = await Dynamsoft.DBR.BarcodeScanner.createInstance(); - await scanner.setUIElement(document.getElementById('div-ui-container')); - await scanner.show(); -} -``` - -Don't forget to load this page using wkWebView in your iOS project. - -### 2. Add DBRWKWebViewHelper - -Creat the file 'DBRWKWebViewHelper.swift' in the sample to your iOS project, and copy the DBRWKWebViewHelper's code in the sample to this file. - -This file provides a class: `DBRWKWebViewHelper`, which will make it very convenient to let the swift code use DBR JS by providing some methods. - -### 3. Pollute your WKWebView - -Class `DBRWKWebViewHelper` provides a method `pollute`, which will inject a global variable `webkit` into the js code in your WKWebView. - -```swift -DBRWKWebViewHelper().pollute(wkWebView); -``` - -The variable is an object that has some methods to communicate with native code, you can call them directly like this: - -```javascript -// e.g. callback after decoding, this will execute our corresponding java code in DBRWKWebViewHelper -scanner.onUniqueRead = (txt, result) => { - const format = result.barcodeFormatString; - window.webkit.messageHandlers.onUniqueRead.postMessage(format + " " + txt); -}; -``` - -For more detailes about webkit: [Apple Developer Documentation](https://developer.apple.com/documentation/webkit/wkscriptmessagehandler). - -## Customize DBRWKWebViewHelper - -**Notice: when you change variables or methods, you should modify both native code and JS code to avoid errors.** - -### 1. Change the methods to be injected - -All methods are injected in the method `pollute`, and defined in the method `userContentController` . You have to modify both of them. - -```swift -// e.g. -// func pollute(wkWebView: WKWebView) -let userContentController = configuration.userContentController -// The parameter name is the name of the injected message handler. -// https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add -userContentController.add(self, name: "onUniqueRead") -userContentController.add(self, name: "onWasmLoaded") -wkWebView.configuration.userContentController = userContentController - -// extension DBRWKWebViewHelper: WKScriptMessageHandler -func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - // message.name is the name of the function called in JS. - // message.body is the parameter passed when calling. - // Both of them are of type string. - switch message.name { - case "onUniqueRead": - // your code here - case "onWasmLoaded": - // your code here - default: - // your code here - } -} -``` - -### 2. Execute JS code - -WKWebView natively has a method `WKWebView.evaluateJavascript()`, you can use it to complete the interaction like the following code. - -```swift -func startScanner() { - wkWebView.evaluateJavaScript("startScanner()") -} -``` - -Then, the following code will execute the function `startScanner()` we just defined in javascript code. - -```java -dbrWKWebViewHelper.startScanner(); -``` \ No newline at end of file From 87515ba0b2cfcb0495e801c0ae1b9389f4adc09f Mon Sep 17 00:00:00 2001 From: Keillion <735699921@qq.com> Date: Sun, 23 Apr 2023 11:01:04 +0800 Subject: [PATCH 7/8] add simple readme, introduce native SDK also --- .../14.read-video-webview/android/RADME.md | 5 ++++ .../dbrjswebview/ExampleInstrumentedTest.kt | 24 ------------------- .../dynamsoft/dbrjswebview/ExampleUnitTest.kt | 17 ------------- .../14.read-video-webview/ios/README.md | 5 ++++ 4 files changed, 10 insertions(+), 41 deletions(-) create mode 100644 1.hello-world/14.read-video-webview/android/RADME.md delete mode 100644 1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt delete mode 100644 1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt create mode 100644 1.hello-world/14.read-video-webview/ios/README.md diff --git a/1.hello-world/14.read-video-webview/android/RADME.md b/1.hello-world/14.read-video-webview/android/RADME.md new file mode 100644 index 00000000..33766b62 --- /dev/null +++ b/1.hello-world/14.read-video-webview/android/RADME.md @@ -0,0 +1,5 @@ +# Hello-world for Android WebView - Dynamsoft Barcode Reader Sample + +This sample demonstrates how to use the [Dynamsoft Barcode Reader](https://www.dynamsoft.com/barcode-reader/overview/) JS Edition in Android. + +If you want to learn how to use the Android Edition SDK in javascript, you can check [Android WebView Barcode Scanning](https://github.com/Dynamsoft/barcode-reader-mobile-samples/tree/main/android/JavaScript/WebViewBarcodeScanning). diff --git a/1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt b/1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt deleted file mode 100644 index 659f32d8..00000000 --- a/1.hello-world/14.read-video-webview/android/app/src/androidTest/java/com/dynamsoft/dbrjswebview/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.dynamsoft.dbrjswebview - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.dynamsoft.dbrjswebview", appContext.packageName) - } -} \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt b/1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt deleted file mode 100644 index b9a705d2..00000000 --- a/1.hello-world/14.read-video-webview/android/app/src/test/java/com/dynamsoft/dbrjswebview/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.dynamsoft.dbrjswebview - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/1.hello-world/14.read-video-webview/ios/README.md b/1.hello-world/14.read-video-webview/ios/README.md new file mode 100644 index 00000000..899d53d7 --- /dev/null +++ b/1.hello-world/14.read-video-webview/ios/README.md @@ -0,0 +1,5 @@ +# Hello-world for iOS WKWebView - Dynamsoft Barcode Reader Sample + +This sample demonstrates how to use the [Dynamsoft Barcode Reader](https://www.dynamsoft.com/barcode-reader/overview/) JS Edition in iOS(Swift). + +If you want to learn how to use the Android Edition SDK in javascript, you can check [iOS WebView Barcode Scanning](https://github.com/Dynamsoft/barcode-reader-mobile-samples/tree/main/ios/JavaScript/WebViewBarcodeScanning). From d32fd8ebf5d1654a7cea25e1feb76d0bb77d22b6 Mon Sep 17 00:00:00 2001 From: Cube <877211593@qq.com> Date: Sun, 23 Apr 2023 11:22:10 +0800 Subject: [PATCH 8/8] update link --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ea1147de..c419212b 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,7 @@ Get the basic features of the library working with plain/native JavaScript or wi * [**Hello World in Electron**](https://www.dynamsoft.com/barcode-reader/programming/javascript/samples-demos/helloworld-electron.html?utm_source=sampleReadme): Decode video stream in a Electron application from a webcam or a built-in camera**Hello World in PWA**](https://demo.dynamsoft.com/samples/dbr/js/1.hello-world/10.read-video-pwa/helloworld-pwa.html?utm_source=sampleReadme): Decode video stream in a PWA application from a webcam or a built-in camera. * [**Hello World with RequireJS**](https://demo.dynamsoft.com/samples/dbr/js/1.hello-world/11.read-video-requirejs.html?utm_source=sampleReadme): Decode video stream in an application using RequireJS from a webcam or a built-in camera. * [**Hello World with ES6**](https://demo.dynamsoft.com/samples/dbr/js/1.hello-world/12.read-video-es6.html?utm_source=sampleReadme): Decode video stream in an application using ES6 from a webcam or a built-in camera. - -* [**Hello World in WebView**](https://demo.dynamsoft.com/samples/dbr/js/1.hello-world/12.read-video-es6.html?utm_source=sampleReadme): Decode video stream in an application in WebView from camera. +* [**Hello World in WebView**](https://github.com/Dynamsoft/barcode-reader-javascript-samples/tree/main/1.hello-world/14.read-video-webview): Decode video stream in an application in WebView from camera. ### Customize Camera UI * [**Use the Default Camera UI**](https://demo.dynamsoft.com/samples/dbr/js/2.ui-tweaking/1.read-video-show-result.html?utm_source=sampleReadme): Show the default camera UI to decode video stream from a webcam or a built-in camera.