From 9b90576393f949fa85e4ba03268e01ebb012407b Mon Sep 17 00:00:00 2001 From: Mark Vayngrib Date: Thu, 19 Nov 2015 19:49:51 +0000 Subject: [PATCH] Initial commit --- .gitignore | 27 ++ LICENSE | 22 ++ RNRandomBytes.h | 15 + RNRandomBytes.m | 28 ++ RNRandomBytes.xcodeproj/project.pbxproj | 274 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 33359 bytes .../xcschemes/RNRandomBytes.xcscheme | 110 +++++++ .../xcschemes/xcschememanagement.plist | 27 ++ RNRandomBytesTests/Info.plist | 24 ++ index.js | 16 + package.json | 20 ++ 12 files changed, 570 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 RNRandomBytes.h create mode 100644 RNRandomBytes.m create mode 100644 RNRandomBytes.xcodeproj/project.pbxproj create mode 100644 RNRandomBytes.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RNRandomBytes.xcodeproj/project.xcworkspace/xcuserdata/tenaciousmv.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/RNRandomBytes.xcscheme create mode 100644 RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 RNRandomBytesTests/Info.plist create mode 100644 index.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..123ae94 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f94a397 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Mark Vayngrib + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/RNRandomBytes.h b/RNRandomBytes.h new file mode 100644 index 0000000..64d34e8 --- /dev/null +++ b/RNRandomBytes.h @@ -0,0 +1,15 @@ +// +// RNRandomBytes.h +// randombytes +// +// Created by Mark Vayngrib on 10/13/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import +#import "RCTBridgeModule.h" +#import "RCTBridge.h" + +@interface RNRandomBytes : NSObject + +@end diff --git a/RNRandomBytes.m b/RNRandomBytes.m new file mode 100644 index 0000000..5474872 --- /dev/null +++ b/RNRandomBytes.m @@ -0,0 +1,28 @@ +// +// RNRandom.m +// randombytes +// +// Created by Mark Vayngrib on 10/13/15. +// Copyright (c) 2015 Facebook. All rights reserved. +// + +#import "RNRandomBytes.h" +#import "RCTBridgeModule.h" +#import "RCTBridge.h" + +@implementation RNRandomBytes + +RCT_EXPORT_MODULE() + +@synthesize bridge = _bridge; + +RCT_EXPORT_METHOD(randomBytes:(NSUInteger)length + callback:(RCTResponseSenderBlock)callback) +{ + NSMutableData* bytes = [NSMutableData dataWithLength:length]; + SecRandomCopyBytes(kSecRandomDefault, length, [bytes mutableBytes]); + NSString *passphrase = [bytes base64EncodedStringWithOptions:0]; + callback(@[[NSNull null], passphrase]); +} + +@end diff --git a/RNRandomBytes.xcodeproj/project.pbxproj b/RNRandomBytes.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3aeb50b --- /dev/null +++ b/RNRandomBytes.xcodeproj/project.pbxproj @@ -0,0 +1,274 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 73EEC93D1BFE4B1D00D468EB /* RNRandomBytes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 73EEC93C1BFE4B1D00D468EB /* RNRandomBytes.h */; }; + 73EEC93F1BFE4B1D00D468EB /* RNRandomBytes.m in Sources */ = {isa = PBXBuildFile; fileRef = 73EEC93E1BFE4B1D00D468EB /* RNRandomBytes.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 73EEC9371BFE4B1D00D468EB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + 73EEC93D1BFE4B1D00D468EB /* RNRandomBytes.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 73EEC9391BFE4B1D00D468EB /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNRandomBytes.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 73EEC93C1BFE4B1D00D468EB /* RNRandomBytes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNRandomBytes.h; sourceTree = ""; }; + 73EEC93E1BFE4B1D00D468EB /* RNRandomBytes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNRandomBytes.m; sourceTree = ""; }; + 73EEC94A1BFE4B1D00D468EB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 73EEC9361BFE4B1D00D468EB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 73EEC9301BFE4B1D00D468EB = { + isa = PBXGroup; + children = ( + 73EEC93C1BFE4B1D00D468EB /* RNRandomBytes.h */, + 73EEC93E1BFE4B1D00D468EB /* RNRandomBytes.m */, + 73EEC9481BFE4B1D00D468EB /* RNRandomBytesTests */, + 73EEC93A1BFE4B1D00D468EB /* Products */, + ); + sourceTree = ""; + }; + 73EEC93A1BFE4B1D00D468EB /* Products */ = { + isa = PBXGroup; + children = ( + 73EEC9391BFE4B1D00D468EB /* libRNRandomBytes.a */, + ); + name = Products; + sourceTree = ""; + }; + 73EEC9481BFE4B1D00D468EB /* RNRandomBytesTests */ = { + isa = PBXGroup; + children = ( + 73EEC9491BFE4B1D00D468EB /* Supporting Files */, + ); + path = RNRandomBytesTests; + sourceTree = ""; + }; + 73EEC9491BFE4B1D00D468EB /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 73EEC94A1BFE4B1D00D468EB /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 73EEC9381BFE4B1D00D468EB /* RNRandomBytes */ = { + isa = PBXNativeTarget; + buildConfigurationList = 73EEC94D1BFE4B1D00D468EB /* Build configuration list for PBXNativeTarget "RNRandomBytes" */; + buildPhases = ( + 73EEC9351BFE4B1D00D468EB /* Sources */, + 73EEC9361BFE4B1D00D468EB /* Frameworks */, + 73EEC9371BFE4B1D00D468EB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RNRandomBytes; + productName = RNRandomBytes; + productReference = 73EEC9391BFE4B1D00D468EB /* libRNRandomBytes.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 73EEC9311BFE4B1D00D468EB /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = "Tradle, Inc."; + TargetAttributes = { + 73EEC9381BFE4B1D00D468EB = { + CreatedOnToolsVersion = 6.4; + }; + }; + }; + buildConfigurationList = 73EEC9341BFE4B1D00D468EB /* Build configuration list for PBXProject "RNRandomBytes" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 73EEC9301BFE4B1D00D468EB; + productRefGroup = 73EEC93A1BFE4B1D00D468EB /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 73EEC9381BFE4B1D00D468EB /* RNRandomBytes */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 73EEC9351BFE4B1D00D468EB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 73EEC93F1BFE4B1D00D468EB /* RNRandomBytes.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 73EEC94B1BFE4B1D00D468EB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../React/**", + "$(SRCROOT)/../react-native/React/**", + ); + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 73EEC94C1BFE4B1D00D468EB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + 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 = gnu99; + 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; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../React/**", + "$(SRCROOT)/../react-native/React/**", + ); + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 73EEC94E1BFE4B1D00D468EB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 73EEC94F1BFE4B1D00D468EB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 73EEC9341BFE4B1D00D468EB /* Build configuration list for PBXProject "RNRandomBytes" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 73EEC94B1BFE4B1D00D468EB /* Debug */, + 73EEC94C1BFE4B1D00D468EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 73EEC94D1BFE4B1D00D468EB /* Build configuration list for PBXNativeTarget "RNRandomBytes" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 73EEC94E1BFE4B1D00D468EB /* Debug */, + 73EEC94F1BFE4B1D00D468EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 73EEC9311BFE4B1D00D468EB /* Project object */; +} diff --git a/RNRandomBytes.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RNRandomBytes.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9628e52 --- /dev/null +++ b/RNRandomBytes.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RNRandomBytes.xcodeproj/project.xcworkspace/xcuserdata/tenaciousmv.xcuserdatad/UserInterfaceState.xcuserstate b/RNRandomBytes.xcodeproj/project.xcworkspace/xcuserdata/tenaciousmv.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5047d34d3d07efa0313b27037713c340b8c28fe5 GIT binary patch literal 33359 zcmdVD2Y6G*@&|hM97#uRSndTEfr<_8y-;OIwuNm;NOGeIVav9#+-*u|XVVjID(MX{ zgalGZLI@!tJ)}1R={+H&k=_$-@@9{8WXU!yx$pnIck_K0TblXp?Ck8!?Cg4XNw3>A zFqoTrh(Z)iF_efBQxfSk>GUS$GH3sQtEan3*|TJ+vt@9gS?TC+>2SfvHsxSXZzP4z z-Lx};uBBK?N<~r8R1B3yrBhR=sZ<7)No7&lR1Q@@l~E?jOwFY%l$Ekk^;84ZNHtN- z)I4fF<)D^O?NkrdOZ8Fx)Bv@NT1%~?&ZN$vE}|}`E}<@^Hc^|YVQLGtmAaYQM%_-` zLG7aMrS?$|Q4dp(Q2VLpsRPs-)SJ{>)Cbfj)ECsZ)UVWU)b9u(8ZjsYg`zMt0V$CR zsZknAM^n&Llz}o)7Aius(HvBR%%}m)M2%=ZvZKYQ4Yi|A)Pn}m3bYz==v;Ijx(Hp2 zu0hwL>(KRRBf1;igLa{N(Qb4f+Jo*#d(nRM6nYvxgPujtq36*H=vDLvdIx=gK17Gn zr|1YeioQiZqMvArMl?+`w1}3`5p*OSMMu+dbTU1eo=RuXnRFptL>JT3=^3OpNn+$oE|bUPGX+c`Q^XWAWuh!mo~TGvDw-ymDbk2^qAJlG zQJu&vvWgl+&7uV&yJ(5XDe4e)in>L8qCwGe(HWvOB2ILc=v>hSqW_345nV32Qgn^z zdeKdy&7!TMTSPlVcZlv1?GoK5+AG>8dPMZNXus$g(et90LQ1prD zi0BK^QPH=eA4ETkeiQvE`b&(&A~7ot7Ke#t;wW*fI6<5wP8ClUtHkNz3~{zNPh2Q2 z5toZ+h-Ztn;!3eWTq`z-E#i7{lX$*(k=P+_6}O9*io3+U;sNn8@k;S(@jCID;&a63 zi`R=U7GEa5LVUIOI`NI-P2w%$ZQ||X+r>M@_lS3k?-xHPepvjN_(}28;^)LKieC{Q z6u&NhOZ=|*1M$b=PsN{$zY>2V{$Bi(_*d~C;{Qr02_un6f+V4ma7m;jMiMWXC`pk_ zk|-r=3((UCUzjZ1z0%BKBhT681{=D)wsj4)#uVCwmurH+v7ei@lfK&ECiEVee=6 zvJbEivisSm*r(ZN*jL!M*>~7?+4tD@*$>zc*)Q3z*rV*%?62%^?C+&Dq=KkmDufE9!l}qcqcywJxpH70 z{Ok2<4ayd`V_;yI3Zo`)G{+26GAe=-arbaayG*Ic*B0n2iu1Da^Giyz3iI-{S(=K% zf~=z4LVaafUS&mrF4r!LHt6(?J^h^ny^a>AuBTpc1Kx zR1%fUi8%?!a#Ajc3+6&@p;9S1H3=k0pp=w~3+2MNaFB)N5;+Z*zKEc^x?6jeSN1!) zoOanH_`uZP>g;#6`dYO)mS}sr2m5>6ZgAUn*-U?t0=~4DmE@M_i}fX0B^9M*S%oEK z1zDxJCB<2q;==rb;#_TIVPTnFmgx`RX?~=E`fgX>kkil#-E_6Noc(rLDv)bh1|d3( zFOprBKmhq}*m`>0OC0@%fdirJkM};gQA)|KRO3s)HVJ6j+MheP}*d)n)rAo zj88eGqtx4}Y1DLT1~rqKMa`x(R0XBwWLyLn$whI|Tnrb>#c}c5DLsr&6;(|cs5$Uc zEmg-Qz!**BlDH|H4t_FmW-i?>i`5JaKvZ>f59(W8gFXENwT_iNLxXmi4Eky9=vi)b zEOWIx;G6mI0gO(qV~Nvkmt_$(2zC@OX!V0Gw`*{vrr+tXLc|_ya52f>Gj=_$F@T;c}gi%HX*=6Atqs0N%*j2G|&^eIZ zCFpShwTM!0rWSI^n<+b&Li7-!Yq0smH4Hkt20Y`|LbVN3t(22XnRm=Blw&`ZW=coyiEo1I3ACtU(pNW>}=%+&erdA65H@jSqsPwrT`xZ zeINvOSrYj~TW1|~3=R!|5e+)~UES^aZlc3hk9GR`6o6mhZ0qTF`Zzpj#L+=Z;AI4- z>Lc(%3SGU0+D=7orf%hmHd8yeV&c1ra19RkkaIvYK;Q(@JE^;fo$lmHHdA+VrCj>L z0D~6Dc2oD0al4P&!WZU(0mzIcjy#wWqE+)OTA_~HfXCGy1{u6#4~GB<1Fi&v>bLLAAEu5FV1Ckm#_73q&jkIFYTH76 zMIEKS<|;V@S35FEzoUK(m_0vHKXX-FHBmTmZoa`K?m{uUcQ!wv1iAj8{u{vj7xgzc zhpT}Z4y+??MlpLm=g)^ki1p_~QWV71aYmt0pYsZ6)Gk|)Q$GN~FlW%&?PziJ3=MQG z%hAH@%F(ZIboGLR>+c~8o1AX=%-#iK>UIv~fZQ#ES=|m2%Ch=-N4JDHx|~2|3vLgE zqXY;aNQNR%B#J`OC{ZDw3l~Fzx1X zT@W@B;J*#rt=x7p`R2L#VBwhou|CDr5g}n-b+A?RO5q51@daZZPo(p1j@J z?{nlZ(xh$SbAogTWuqLFONF33l#dEfA=qbsPtTwy?vbt-iTJX(c4xP1Xuu;FNhh2u z20h=z_x8KGz*Ud=igR%kH=lFAj*3wUG*F7lP&qV`hi1UCZ5Gwk1Zz@vYrnI*q1OTb zKRCaI;C2t%R`wES+3HQlH2m6?_@Tfq&hP1W3EhR3TwJFNaSL8U8dL$TX^{@;Q6;KE z)s!AOF8HC^o)%s~i$>xS370%Ym&4UP@-az#z>BUhwF$f<-*HZE5!b;j3fy?$~1->}IPgGP(Ujyc#him% zGB$wo@eDPgW{>+GQ53WV&YR~oJ6!$4XdYF15*k5*1z_X#Tr1f1l2PszIY7WAs0Fp6 z{Q1J*)LUws2VGrG$eFr&xi+qyqwKPlHb_Fsb8`OQoW-8LcOVzUa>y!#Argjn7%e4T z9`7p;ryF(IW$7@t0tRhFg@Lv$EDlqU64k4(I@u(mp$HG*#s zuv#O(xJ(e{z&PJc6u#5101r!wgCjm>zVIE)W$<~uLrdJQ7VjdPgwmF*fu5oM79kBo z51>b=$gSu>v=2Rm9_Ba>b7yjAZAFiw$0!wgf;*c#2cqG*WIW={p4cF?U=utAEYL@N z(^PXl-_Vli6gk+3WPSYLhN~ie0AmMGvxU@QlBpu52r>c#`=XM4y4b_#7O`m#Bpl zLzXxOob%z|ey5wyc)+b(%C&hW`Pb;1dZQJFa~OS1Rz1Ykd`C?8d+u^>LO}9cT1pn? z1x3E(7yXR>pwwH@FX&hF8~UBQg1eHtio1F%`V$?4;Pe-F4R;enqitMzQ?0YjyPS;y zhvLgJd|Apo&$K6LOtZz+-oX=lCk`#9gP|E(LbJ4#4&tumuH&xfZrBQo8a*9GDZzpg zxEmqE0w*%D!O`y`@gK?#&gCS78L&8(dsYZ`Sz_R~-g#_o>EV-zfG>IWo_@%q23q=E zy<~k4Oa1^79-T}@UTbs=mA}b1+39#XQOLRJiQGnS&P}JlqL@yl<=iH2i!a}%6|~wv z^`+D3bZ#>@%qe|(Q_Nl!kS)_$bZ!7k9-Yr^W~lhf+_K;-_G&K?;J!};)&0Bd!C?Y{l0@e#!5*&o5JrE(@v)B%FA71G+y}gx?N)H&i z>s;L~pR6EI!0%q85lrQ5`aD=g)929Vau0Kl4AbY+7jTbqFA@tmMVDolm3Vv`|NjNv zHJf#)mvmyZrwgDFWVo2VjL2{aeJS@C_rx%LIlY0~&piu^;1O>~U&DL8$Nz7#PXC5) z+e+a83AkP|y-0u0TVhEP$ zR_7r2tafh&K5D|}%Sn(PCIrkR#{z$C&iv9-tK7Ew_ntPjjXPEw$ z{*HT>d+!v=#ISQRq7z@DK~~u#X{=&)Yhal9mHs23xj*S++y~r;oDz!8=XyvX-92s> z`2>KWA#Gw9?h|gpAw~kLUswY(EF)!tnBe9CKGy&z&K==C(J&Q^meDbKrjn^*su=?_hpAy|nL5VEm>4rNm$5Kb#>Uh$ z4NN1`#56PWnEA{CW+AhPu``Pq2eX7}VOkj{)5f$j9gK@v%5*YrriGniG(YGw_ymRZMe3}((`&SK7H&SB1F&STDJE?_QX)-(TME@Ccb zE@3WZE@LidHZWH(S29;IS2Ncz*D}{J*E2UTH!?Rd8<|baW@eb#!fa)3X0|c6Ft;+> znH|h+%|m<}T)L<{oAjb1$=-xsTby+|TS~9$+41_Aw7J4>ON2k1~%jk26m& zPcr+Nr>5c3-II`aneCi52aHuDbiF7qDq zKJx+dA@dRQG4ly?nE8}B!hFVj&V0dq$$Z5eWxi&p8V18tNVt!_RVSZ(P zV}57;VE$x|G5=-$V*VCUA|#?kj7TIBizFgeBozgTf<+;sP*Ip@f+$=h6Gez3MNy(? zQH&^76eo%oC5RG56Gcg)WKoJJRU{Wp5=|BjMbnt)L_Mly^dFp9(| z3ZrO@VlaxuC=R1|j1n+P#AqT$Nf;$#l!8$zMskcMVKf;d1x8AYR2Zo-O2a4}qbV3o z#V7-#OpLNH%El-Mqg;&gFv`cM0HZ>TiZCk1s05=@jLI-7$7mWx(=nQX(M*hHVKf^f z4Mr6hX))4aq{pZdqbiK5F*0B@2csH{YB8$A$cT{%BQr*GF|uG}#mI(HJw^=}HDc6+ zQ8PyKFq)6i0*n@7vc*%C zqh5^qFzUx>0HZ;ShA>)&(Q=GdV6+mWGca0((Q1s=V6+yabr^9NVT{g%0u@GQV{{Hi z=VEjoM(1O60Y(>Mv>v1XU~~~i7h`k@MweoA8Ag|5v;m_lFuD?>t1!A6qiZm_7NhGh zx*nq&FuD<=n=sml(I$*GV>FD>7L2xHbTdZVFuDb!TQS;>(GHAm!{~O5?!f3yjCNvl z7e;qubPq&2&0EFdIY0KF?tN6$1!>WqbD)i zkI_>YJ&n;b7(I*8a~M63(F+*8h|x4qHdKaVjFnS-O4>0-=qmMB97^6=xI*ie$7#+drGvc{IMA@PoQEoF-8V2~HGWRPS z89;nxY7n+yU|(}!^=geyXRsMeMoq2Vs;jZ`RR~eOr~sBKzI|3tO?nG_T*&X`dwv&M zC?U8pV{k3nYC!V{QBFwWMw38$7L&;)5X~S&iZMj>W>R+1>+I%QjjhsTsq>-ECJYlt zGc;&w4LZBVzj-YoOhBI4;|rUsS6iFw`~|2y4w@7>TAdWMJ){p9HRY!j&_cOJ7%^*TMSTt~D8LdZUg1S7R_*?bb#^rEiFu z2y@zK<|@5WZ_(KF&~;O#q1Irm0(PBVXmLJanmwAyrzV3@TU)Qw+pF~&*m$8X&C& z`#05Fw0b*qK@Vb>ETBbRG~dv)5`GmTMLoF{&UHXiy?Qn2s@-a+GTK3J23xJZ4*vDA zv=f#|$7O+<31RX{xRj7*9+%vr_sVFgCo-BfwrZhoU4&CPiqmAP)?4_&@JLu$tEuvd z)=M}Pqc}k24F;k-GK!w@^bOi~bO8#v zn9!w+i$~O9CnF-XeHo#R4xrV+u=zROD+onG0EHl(zlB{*$W#GjbsDY7+GO|BmQ7=+ z();|ybz_mOH3l=w}_1iq?-t-GJur-UV!8sFz+=4 zjxB^EejE;~t-01`+uI10B7n-%6##@IEe7HjG*G9}NP;omw=rzv%Zl_xgYZo{sv3fO(EzEnnQB&uW`yN7=gvKWXC0l%B zvHL`jR-4JE;`<3<%5fk^#h?cXZ5*m~b$9a4u%h0m0|{$Q#Fq;r@Gv1#jS%UYYYi3P zmFmE{3>6SCY|W!%+hc?!bqq_r#X_d!C?TFC#L0fd5J|jFkC=|xZz4WTNYh40Az0Ob zhtwIYkXd@y6Y>F%c7zG&Kh_5c@uZPv#!}iVV8RG$e|;3TXa5R12Wd}* zsn+8J1>&~|aqI{-k=G91+Ga5N0N*7v>Jb{EJbR@ctv$Y(}$_W|LF z8Q}qsQEfNbZOvvM?8k&8dW6Je0o&m{v>@E4gd)k0f)8uZmd#|U4TwIU6G}gO^aQ|K zT>#Nngvd{iMCp37-UzW++svm<0j+;S$o?2L}*e*I#r|Bn<3&F8c3idIgG{Vqy3f8mW4X)u<{fLlv_vc!C1$}ct9w0m>BIx?pr~6~hCk_u)G$uO!FiT7R=o{;hcDX{D+%Kye@37F z%{5g7Bw!5E#)wpD0iWDxveb-n|Kh2HG(aaKBKb{9aTcKq(EA9T$4@|4y}27C{{gm} zOL!Ij();n&+sySa|M>-%pr?WpG#1bdKYsiQT$p*{;uAFH84d4ZNocH$Fa&78V-0nh zK*OF+=mM-_q!%MX38=FOwc5YW#Fjnl0#AIi+N&!eiP6|J0#60uN%Q9sJeqHLXR0Oc z-7m2e>j~3jf2I-f1$O^|tS0oS{`4?vWTEJt1pWz1ha*Xar?!!#HeMfJ51C1TqZcnEOsY{#BeQLs*dSg^SSF8R z@rR;$}#m&H-T)- zuP1hEeFfBK_y{zTt%%*@A$h9+r-#%-kVcOLulp0Ish==KAsc_j07?rsJ;Z`)SWybo zYlsl!`w@`9Vdq!15SU2v2MGZL1C15ZOyI557;5Vwa0&b?2)`0}4=#H`n>VM1Da5BS zfw{GK72!w;;P6t6NtDEE39ah*wB7?$I=!}55C{_%`SDpi?oOaS`y|xX`bxi0b>4AB zCqB&D49Q!afP5jLopgLT_?YHPrNkEz@>y^?!|jyU);841i?j3OS#rKGRORe;_VWis zpf*$s>j_9MN0;Pk^$mKT4lX?{u%^;t2!JGW;+MP@aC@YpA#`K|0V_JWWTc)*oDVon zsF!N|iWTCk2*m7DgYd<0zK;;biDLQHg&@$i1g-GY&~(k}&*xwTYt+|*nSoK6%w!!P2zM(1n|gB95gWGG+Dro9ZG^AjZ%cmJ-kk)X_|yPkv|+_k2ld(tsI`$T2!7K*d^f?+oE*b5$xLROq0TVRQvwF< z@{!v=Yq*!d<(wRj^r;e7c2EoORaeD(2y^MFG25!aE9NuJ?A%eNK9?CZL)&Qhu3DP*0H$IZETGR$$yfA)$YT;b- zkfR+6al}Tnu-#)fSnY6J7mEK-Rv{k<8hM!@z>S(mGR=<&^Vnc9E;IOEn4S=_%q9aV z^z*f=X1f;3^1g|3_*C#9Lxd?0lLXQgZ}COvT?g2$U=@DJ{AUEOG+fF7(qJz zWE}^|V`#!;{hRO~f8GfEegR)=HpALatA~&`lKM$#f^+;~IS!5m$~0a{Bw~Uv@3`s( z1kX+cIB`#4fSCg6ixEOMzhWm2(Ys{|Kfq3|P_gl>=Y>fnk&<@GPNN;KMUH|AAu!WU z1IEj5*VNlg#1RSoopcpfx=0U^H>x*A8Y#u^(OMumg8El#*Xf$V8}nY{}HUZy&0 zl@&_l0!|{qnL9?NQ8>hA!4E+?Mm9uY$>LY-0<*E%VXo?ksdzn}&q9*NS74)~pKQ9z z%{}mUPH14uROC6U!kt=${deQ0umHg;y50L`q|!I=z$Pi+cwWopYF++ZAbS5po>hUD!B-!_uI)@;Soh-*! zhaa-O&J3G}6((J?V3_%*D<`p0Udl>1{=p}48ZFt@fs-(xVL$B_5#+H`=lF8^kRb=q znHmKNO9_ttpJ}oJHoS;rfmIsGGy-Y(XOKca$AO*sFC-;#dmKm&fz2^27i8MEOr&aww{Kxz9A?3rv|93%mYgzj;^x47IuYTb5vWShxsMg z!kp99u&)8njJ4=(_2B&c(r`%~fvox`G7EJ?IK=?-vl?prKF?w%ptgSk>XB1`t~BUj z=gm(!z80*ch12mbqckD30I|kqBKq(lHxT60nHVKw9~N!ziwM$ zy$;jORByHWX5QFI=OisSPSe&rF&DB=@2L{lwh=T!jKP-@jE%+}q`8IvtU1Ab2umc0 zpwL}71H>OP8x#0DNmF&F*%Tj}NFO}GpI@EYZE*esmX)?j!5X^>^go*Q^{`zo_$oLz z3#qZsa{379*u41oChoJGdSi_dPOO2DnkqOZAxJq$04q;J0e;2TlwIG zbiHprpY?Cm$Ddz@V+Dfx&Lx0jD=>aWTR&Jzv|M$ajAQ)MNb zlQ306tyyaks_&A^3Fg?+#0fMA^@-f3k?mlgbXO9j6NbKV)}fx1o!=ZKXPdN8Z%RknS-`deP7X0ee6AXn0c8~^6 z7^lYXhPMjA$LYuT3-~J# zq8(qRvG;$|1XP8{p*I~V0olO=HtIFLdfYzJ#0i&le#$?7FQAs8CkG${upc4Vr|M$H z#U|Ueu#z+AVBQ?x01W$TI8B;hkNB2u=fTvCGsO&IOi#ztz5kts*J=$ z$(B98O$n!yHMPyKU=`--^90Fs3P|IkkdiQwOn|jRSq0K!0sJKbKI3133s46Llx{2( ze-ZQ;8p)dUWlb6*7@(493i09{|3~X@x#H8k%aY&f2~^LZuugK zpxUGVT2QYe*P38!K|uYMpz_zo26_tLfLWa_L;Y}h&6ueJ=acI#sK-kzM1$Dj7Q$`b7`Hi$< z{hzf0e-CADgwy6Db^1R^1Lpr(19dgzD4X#2JCeT$`o9}iex@-n z^n>@Z8g>d?R>MwZGcfuQqhEa2)v(!Yp8qvvY(86n(N7rtOfD)rmHTL%v;D6wV@ug- z{&500*-y*_Rz_lx^7NbA>E~H^A*($c03C8HZ7#+jtPyQyF z|I@3F_}ivxzx%aNP<9Yr{0cG`xbsaOsU+8}wdS z6L=F$;N2_2BpV34jppPkTR>E{5Yr;xRW!0g_{d8+$c$&5z%0J5~e3(T7hXLe4=a~ z%gWc}=}Yo- z`FR>$al;BYz+PO~;4%~FX3sw*nfby1>|-A#-sd6qVfGPBt1+F1>GUn^W9;MX6PTWY z=_*WD6RXIDyAuL$SM=V*2)BA!hq}nU=AMDJI@`%*1>~y5F)ZFSIp|=_S2ow6+v%BD z&r)qSv(K^5voEkOvM*tJDyH)=U4-c}OwSyNItN&|JZ=m7DtnMUgy{@SXJR^Q3;R0z z2Ky$avoW26>0BbZdQ4*hlEO{7a1qrYj9A8r2`k_)6s=CUft?HvT%mkoYEK*domq<6 zQa)%=EtFhEQ}XfW!bj|<jffayZGV$c&SDQd2~p09KWL-`H+!+88Z zvOlpuW4ajAB^WM01%8=F7)$wa1o@NwdmJDsB}Gz*Mdg^DhUw`5H0!&7UcD-1sSv4D z8bmJLZH0T9O%ZhG65;JNL^C3>WZEgdxpoID4VNWOOj4>c@(P7lj)HTEq25g8m6n=sCsNW;-FoQM+-$Hl`l zML}FhgV9$QwbQ-K31uLM(K+OVn@c+la7llE8@!j4Rng;aeN~;7K4rYOd%R5#r%xSuxF<6! zI6Eg7q-pGM4LYHZyi`{5_)2R;c?L_RDn1JB~8qgIdh zhRdgp`#FCR5x97`OV#@l-hml2ZRDW?4#69E5%9c|0^YsLr%E8=*H9LC;cf}MZr4W* zP(#!@>Rfo!?po>w>Lz&AZVS9;M;K8IK9WN0E%q6~Od zp#&Z|s69=8!hL+v<}mia4jF7+e|*O5AeLta1tVr37kKA z)@3qVPpf04+%YIGE-xsNo9kp>26`>tRZFv}w#`%+%(^ts@A;4uky~h`MdTh@40j-> z`Q0|kR+HOCA?+T=$fPr*GwaD})XCdf0yP<4SS+H-sac|TL?4O15&Z&h;Yr~gyl`;@ zyn`1nPK1~6wBmW73*KVztgO}~j7H<$=32)k6E506Hwc9A(4DZ_ABYs^H zC#jTlz-w|F;k`KWR@{Ec(~?)-qmu6>f3Pf@2=BqAz*}&WStYB6*WjkIneY;v zhSkDLa8;}U-h!)xBz-O<=5BT!yB=P0dx`z8R0eOeWl3|SxzY-$NotYWq>a*M>3nIA zbcJ+{be$AS&yrp$y;6F$^jhgn(oND~=~n4I(*4q>q%TX~lzuAxQu?d(nDnn8Do7l} z1_cF$1VslW2W18o1WgaJ1T_b>1$72>1@#0C1}zI(5p+h-#X)xm9SZs==$oMLf_@14 zDd?A=--7-KW`n^y28RWQ2S)@)1;+$u22TsF3w8%zAN)x03&Af39|%4a{Ce=4!Cwad z8vIA_vEaW$PzVze5t0(32vLQkg=B_ghvbIjhZKZN53z?6<MHW=-Hv?hF%eRW9W|1ouPM!?h3s>^nuWQp$~^12z@)OEUYrDIc$E| z!Z3T7BdjIN8P*==3hNA88^(p58FqHqxnbvrT^RPCu#3Yk4ZA$-#<2Uso(y{@>`2(L z38@nbCR9#noZy~t?u5+~woJHr!YvcFPk4O7^Ald3@P0T74+{?uj|h(nj|qFFiKPUXW@V()Whd&+uZ20rxFNVJz{%QDE;a`V;8~(kFk%h`KWVtev zY=LZ%Y_V*KtXH;1c7bez>`K|yvTJ33M@S=5A`}s25fu?#5&aQ2M%)*1f5Zb3`yw8W zcsk;_h!-MWig+UuMM@%bBg-P~k*$#zMqV9xUE~ds8zVPIZi#$8^3BM1BHxSrF!JNb z!;xP^{u24$$iJgd6cZI36&f`mN){CvH8ZLqsyk|V)EQB$qt-^PkGd}EhNzpOHbo6b zZH?L%b!*g~sJ&4SMm-euNYrCdPekpHdOGS*)Q3@jMu$gdL>r>(qx+)QMxPgbLG=3Q zi=r=yz9#y*=o_MMiry4G9Q{!A;piV?5@QrGnK4B%b7E>^j4|dION=dMVa$@4)|j@K zj+mjChnjb79PXVlIxkA!d8bZ83Mm?2OqT^G(d3u}o}uY(#8SY)ouQtTJ{= zY<_G}Y)NcctT}dJY+Gzc?9y0wYUjQu$FaO{!T&*LO>wT@-hD+!b+G z#a$D3bKH)&+vDzx+ZDGvZcp6axX0t3k9#xjy|@qJK8iaM_j%lxaYy5RiTgV~G(J2& zB0f4kHaUjMGvZgruZ>?He`);X@mIuO z8-IQLjqw}fx5wWT|496k@lVA+6aQlT%kc-|55|8Q|4sa#39^L9gy@9Wg!qKSgrtO& z1bM>b1Z6^5!nA}L39}L^67&hx2{j4E1apEV!IsdOaDKvY!p?-J5`Iq%NmM7!PHaqU zO>`x8CUzzECk`eqOI(q-Iq{vu&lA5+{5J9X#9tDBOZ+48*u{j zC!Ra;{E6R8{4+_EBuSDc1t*0j#U#ZgB_vHuN=`~mN>9p5Do?6PGACJ*Y)K7CO-YWV zmLz9Vdy*@uGifksP13nZ804N;#S;OHD{sr)H#PrRJm-rWU7`rk1Bp zOVy<=PIaZaQ@c}pQ*rA0)QeItNxdxfiqtPtf0R>lRvsh|k%!5n<+1X3d7?Z?u8>ca zo8+DHmGU#?=g7~KUm(9qzD0hs{1*9k`EBw$Vt#SX`YN*Sw6P$nr;m6Me!Wx6s$nXSxI7Ai}W<;oe#*-EXlQfW}uDosj@vR>JwoUdG@ zbSPVu?aHOfE@iKBK)Fo0Qn^~WPI;#C9Oe1S^~#HtmnpAMUah=Nd82ZZa*J}Ca=Y?& z$(;l;0@7SN^2@ zRr!bVzp#*IR1#H?DpVD&id4m@;#Ct>DXK{-r7BG|Rh6a6RTZd;Rb{H_s#&TEm0ne? zs!MGT> zsvA@rRl};ARkx~cQ{Ab$TXnB$kLm%{L#jtrPpF_^|I9 ztols#rRrp!9aH_SrqyD#R2`z8ppH;StK-y(>SVQCtx&7gQ`DL29Cg0B zNL{L)rk<(RsCDWp^&EAb+N`#!8`RC}1!}u`iMmzYrCzRHslHylRehiOA@x)0m(>T< zU#Ndj|CBZ%EiNq~ZB|-!+MKkGw7#@~v`f;iNxLrXzO+Zu9!vWo?T56V(qqz7(&gzh z)2q@A>4WKO($}Tmo&G@jzVsvM-==>*rEtoODYK^ZPFXo+)s(xY?49!9luxD{o$}4p z$f*;jCQq%MT0gaM>e{L2O}$|1&Z+lLePHULsqanwVCr8PY(`K*(ly(0Ij+?~1i=RT18N$%0yZ}KF0;dv2x z>3Mm11$mad`FRWTmgjMKXXb6o+nINF-dlMe=N-=bZ@wg7nm;8!Kff@)JAZlp%KRJi zx8>iO|7`xN`G@kq$^SL~_kx&$lmdByuAr{KRM1&4Sg@?%>Vi!L!v#+iyio8`!7l}W z7ox)a!fAyw3g;EJ6gmsfFTAX9L*cH%eT5Gf9xeR2@YkY=Mam*|QDu>-Xl_w=(ek2| zMLUXi740s1r|59ek>a>wdGX}p>f*V@*5cmcmBp)yZz{f}czf}y#qSiqSHhOaN+L^2 zN@kZ-l(d#~mGqQcShAty%94F0`%9iK`L5*ml0Qq;r8%W}rE^Q?l`befxAcStfSf(gbl~t9Q%PeJ=m0eeML)klJhs%zX%gPhVCzj`xmzPg3?<+r} ze0BMj^4rVrEPuKD&GNUW(bGbvg-y$yRyJ+gv_;d}r@5wGIBmnUE2r(9_V~0Xr%R@X zPmh>xoxWiDqUl#n-#C5q^uyD?p8o9&^^BYuc{7&HST_UDcyh*zGhUtP*MX zr8C_#ubnwObL-5vXMQsC(^)CA(q>JW)irC`tQE6%%-S_;_pI+`{XXl@+2ymfv-Pvj zn0?mlb7ns?`@rmjnqWvrcI}9W3)w$LA)dSV5tJhXPSp8)6Q-(x?!k{vA82StYh8>1ohTVo= z=TLL#Ip#UdbLP*vea`MVduk*#;WZI8wwi@C_L@6u_SEdH`K9LXT2yPOwba^bH`Q*h zy{-1g+GDkU!Qld9ow;sv-Hy83jkGbu7-p_{`j;Bw8srU=8ypQw8{7@|H$2wxL}Nr_Vq;Qcf8(mgHH`-w-)(%qDYL1l zsif)hrt6z-Z2Gb3Skqt4)y;F8tSZzTW=2{R8_)i>EBk zUtG9&-Qx2XU%2?~#h)zx)RE^XcT9I&?bzfPcKo&kEn${4EU_*Q8t ztF3ii>z%FdIm4V&oW;&E=QQU`r^cyu);i}pZO%q#v$M_F36IS5K*e>r^9<)|=O*WN z=Y7rxoew!5aX#sM%K5DGdFLVLch29P$DDt+p|;4jn6~(~iESxu7qwm0wxw-H+Z}Cp zwe4zqpzWcyN86rg+u!zL+o87K+u3$SduDr1dwzRiyQbaPKDXW0-q=2`ePR3J_OABc z_JQ`H_T}v>+gG)(Y2VWRNc)kF(2mTGxgGO5938D4?Hx-y+#N$5%R4rA?C7|?<3PvT z9q+m%u5g#k73oTKO?IhV>8=b{mdoN=;BvuB$vv)q*N|(u>m1hx*Cy94*L|+Nu6?dY zT#vi9J0xGq^Llb5dt|XGUjsXI^J%=d{k5otjQ<=d#YrI(KyL>U_BKvCbzupYD9F z^Tp1WJKyd6r1MDU7oA5tf9(9F^Y_kUoqxI0-1TnkzR-P{d!zey_b&H+?!E4P?kC(& zxu12v;C{*dhWjn|2kxWpAKkyWe|I12V!9+^_ECL7eGz?$eaU_5zO26dK7C(RUwz-AK1W|mpR=#KZ>Vp1 m-^#w#eQW#H_g&O?N#EstTl=>6?ex}}XwSdWQFW%iyZ;|?c#awX literal 0 HcmV?d00001 diff --git a/RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/RNRandomBytes.xcscheme b/RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/RNRandomBytes.xcscheme new file mode 100644 index 0000000..527db78 --- /dev/null +++ b/RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/RNRandomBytes.xcscheme @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/xcschememanagement.plist b/RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..d163fa6 --- /dev/null +++ b/RNRandomBytes.xcodeproj/xcuserdata/tenaciousmv.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + RNRandomBytes.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + 73EEC9381BFE4B1D00D468EB + + primary + + + 73EEC9431BFE4B1D00D468EB + + primary + + + + + diff --git a/RNRandomBytesTests/Info.plist b/RNRandomBytesTests/Info.plist new file mode 100644 index 0000000..d6695f0 --- /dev/null +++ b/RNRandomBytesTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + io.tradle.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/index.js b/index.js new file mode 100644 index 0000000..7ed410a --- /dev/null +++ b/index.js @@ -0,0 +1,16 @@ +if (typeof Buffer === 'undefined') { + global.Buffer = require('buffer').Buffer +} + +var { + RNRandomBytes +} = require('react-native').NativeModules + +export function randomBytes (length, cb) { + if (!cb) throw new Error('synchronous API not supported') + + RNRandomBytes.randomBytes(length, function (err, base64String) { + if (err) cb(err) + else cb(null, new Buffer(base64String, 'base64')) + }) +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..52adb2b --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "react-native-randombytes", + "version": "1.0.0", + "description": "randomBytes for react-native", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "react-component", + "react-native", + "randomBytes", + "rng" + ], + "dependencies": { + "buffer": "^3.5.2" + }, + "author": "Mark Vayngrib (http://github.com/mvayngrib)", + "license": "ISC" +}