bplist00 * ( B C E F G H_frameworkVersion_editorViewerForceClear_inputParametersYrootPatch^portAttributes^virtualPatchesYprotocolsYcopyright[descriptionTname_editorViewerWindowV156.16   &'()'[Color_Style_Show_Live_Video_Only_Once]Overall_Color_Show_Video_PinP_Mirror_Image_Video_1_Default_Message_1_Iteration_Speed_Initial_delay_sec_1_Level_of_DetailWkF_mode  !"#SredUalphaTblueUgreen#?#?#?#? _video input unavailable#@+,-.UclassUstateWQCPatch/01234[connectionsXtimebase_publishedInputPortsXuserInfoUnodesk56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   #%')-.01257:<>ADFJKMORTWXZ\^`adgjlnpsuwz{~]connection_32^connection_114]connection_97]connection_21]connection_86]connection_10^connection_100]connection_64\connection_8]connection_53]connection_19]connection_42^connection_109]connection_31]connection_96]connection_20]connection_85^connection_118]connection_63\connection_6^connection_104]connection_29]connection_52]connection_18]connection_41]connection_30]connection_95^connection_113]connection_84\connection_4]connection_39]connection_28]connection_51]connection_17]connection_40^connection_108]connection_94]connection_83]connection_49\connection_2^connection_117]connection_38]connection_27]connection_50^connection_103]connection_16]connection_93^connection_112]connection_82]connection_71]connection_37]connection_60]connection_26]connection_15\connection_9^connection_107]connection_69]connection_92]connection_81]connection_58]connection_47]connection_70^connection_116]connection_36]connection_25^connection_102]connection_14\connection_7]connection_79]connection_68^connection_111]connection_57]connection_80]connection_46]connection_35]connection_24\connection_5]connection_89]connection_13]connection_78]connection_67]connection_90^connection_106]connection_56]connection_45]connection_34^connection_115]connection_99]connection_23\connection_3]connection_88]connection_12^connection_101]connection_77]connection_66^connection_110]connection_55]connection_44]connection_33]connection_98\connection_1]connection_22]connection_87]connection_11^connection_105]connection_54]connection_43ZsourceNode_destinationPortZsourcePort_destinationNode_ColorFromComponents_hsl_1Ucolor[outputColor]ImageKernel_2ZSplitter_2VheightVoutput^ImageKernel_15ZSplitter_8ZinputWidthXSprite_1ZSplitter_3Uimage]ImageKernel_5ZSplitter_1Yoperand_1VMath_2]ImageResize_1ZinputImage[outputImage[Billboard_1WPatch_2UinputVOutputWPatch_7[Splitter_12_diff_color_cutoff]ImageKernel_9_inputImage_proxy_1VoutputWPatch_6]ImageKernel_1]ImageKernel_6Xsource_0[outputImage]Multiplexer_3Uwidth_ColorToComponents_hsl_1ZinputAlpha[outputAlpha\JavaScript_3Xsource_1Zout_height]Multiplexer_8]ImageKernel_8\JavaScript_2]desired_WidthYout_width\JavaScript_4Xsource_2Zout_heightUinput[Splitter_11_ColorFromComponents_rgb_4Xsource_3]Multiplexer_2Vinput2Woutput2ZinputValue[Splitter_10UWidthWPatch_4ZSplitter_4[itsfr_indexVinput3Woutput3\ScreenInfo_2Yin_height_outputPixelsHigh\JavaScript_1Xsource_0Zout_height  \ScreenInfo_3Yin_height _Initial_U_and_VXsource_7Vinput1Woutput1[Splitter_16_Error_message_textVMath_1]inputDuration[outputValue_Interpolation_1]GammaAdjust_2Tlive[outputImage]ImageKernel_3!"Xin_width_outputPixelsWide $"Xin_width&Xsource_6(_ColorControls_1*+,Xsource_2Yout_width]Multiplexer_7/]ImageKernel_434ZSplitter_5W_enable6_outputImage_proxy_189,Xsource_0Yout_width34;\FPSDisplay_1=Yoperand_2?@^ImageKernel_14]kF_parametersBCWPatch_3_outputImage_proxy_1EXsource_3GHI[Splitter_13Qa\Expression_1BCL_outputImage_proxy_1N_diff_color_cutoffPQ^desired_heightZout_heightSB^desired_heightUV[Splitter_15_Flip_HorizontalY_diff_color_cutoff[Yin_height/]Xsource_4_Xsource_1,bc\ScreenInfo_1[inputHeightbefZinputScale[outputWidthhi_ColorToComponents_rgb_1Tin_khkTin_FmYin_heightoB]desired_WidthqrZSplitter_6ZinputIndextXsource_5v]ImageKernel_7xy]GammaAdjust_1_ColorMonochrome_1|}_ColorFromComponents_rgb_1Xsource_2b"ZinputWidthZSplitter_7Xscale_duhZinputColorhUin_szrZSplitter_9BC?Tlivev/"Xin_width[inputHeightBCxYInit__Run[outputValue_ColorFromComponents_rgb_3Xsource_1\RangeValue_1ZoutputClipVMath_3VinputYhWkF_mode"Xin_width[Splitter_14ZinputValue,Xsource_1Yout_widthVHeight_ColorFromComponents_rgb_2Xsource_0I[inputRepeat\outputResultr,B_inputImage_proxy_1vXsource_2Vparent,TnodeSkeyTport2Ox streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name Overall Color,r2Ov streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name Color Style,q2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namek-F modemenuNSMutableArrayNSArrayVideo-ParametrizedParam Space View Uskate-WorldMitosis,2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameLevel of DetailmenuNSMutableArrayNSArrayHalfNormalDouble,2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameIteration SpeedmenuNSMutableArrayNSArrayOnce per Frame 3x per Frame 8x per Frame,G2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameShow Live Video Only Once,2O~ streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameInitial delay (sec),32O| streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameShow Video P-in-P,U2O} streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameMirror Image Video,2Oz streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameDefault MessageO  streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+ zoomFactorNSNumberNSValue*f scrolling {CGPoint=dd}@positionnoteListNSMutableArrayNSArraybounds {CGRect={CGPoint=dd}{CGSize=dd}}t@ Ue~@d@J|@stringcolor rendering kernelscolorNSColorcffff??Gray-Scott iterator kernel with video feedback loop and a 2nd video input to modulate the k and F parameters at each grid point. Eight calc steps cascaded to speed animation on fast graphics cards. For a 1280x720 bitmap, each stage performs 30 MFLOP/frame (240 MFLOP/frame total)bounds@ U@m@p@?initial U and V grid valuesbounds`T͌@@d@[@?Contrast enhancebounds@y@@T@ja@Q@boundsa@@l@X@@Live Video feed, or a text message if video input is unavailable?color?stringGControl when and how often the PDE simulation pattern is re-initialized@k@O{@Tx@Uub@TE@S~@j~@Ti@Scale to fit screen (Per user options and execution environment, rendering might be done at 640x480 VGA resolution to avoid texture patch size restrictions, performance limits or other limitations of the graphics card)?@zz@o@[@User selection of key color?L??L?User selection of color style@~@Ub@g@?L?User Option: Mirror Image VideoсD.Scale bitmap and choose a nearby nice multiple?z{,Resize iSight input to selected display size?5User Option - Show Live P-in-P?L?W?<User Option - Level of Detail?L? AX*Old colorspace-based initial U&V generatorL?L?L?User option - Eval MethodO<?L?ŒThis constant must be about 75 on GeForce 120 and probably other GPUs. For ATI 5770 16-bit float I am using 600. The correct value is 3.0e5, but ATI 5770 can only handle that if linear filtering is enabled in the kernels (which causes huge accuracy errors).boundsk33s?ff&?ff&?User Option - k-F Modew2?L?contrast enhance pp 20101016kL?L?L?U&V generator pp 20101016NML?L?L?$Generate and position P-in-P display9?Œ'Select mode of k-F parameter generationv:9Ò?Œ!User Option - Show Live Only OnceBÒ?L?ŒUser Option - Initial delay5Ò?L?ŒUser Option - Default Message~FÒ?L?B"5LU[gr}Vdov}(59FSXcox     #+,WQCClear2  _ivarInputPortStates_clearColorBuffer_systemInputPortStates_clearDepthBufferZinputColorUvalue##?## 4 O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}  WClear_1+,[QCBillboard2 [CIRendering_optimizedRenderingXsizeModeWversion\pixelAligned VinputYZinputColor]inputRotation]inputBlendingVinputX_inputPixelAligned#   #?@#?#?@#?@ #)# ZautoHeight4 O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd} +,b\QCScreenInfo2 ]cleanApertureO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name screen dimenspositionNSValue* {CGPoint=dd} A +,#$_QCInterpolation0%2&04)_customInputPortStates'()*,.\inputTension[inputValue1[inputValue2+#?-#/#?12_inputInterpolation3O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namegate live videopositionNSValue* {CGPoint=dd},+67(JKZidentifier89:%;2<'''=GHIGYhasBypass]filterVersion_normalizeCoordinates\wrappingMode]filteringMode>?@ACE]inputContrast_inputSaturation_inputBrightnessB#@eD#?ZZ`F#?XBilinearO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameColor AdjustmentpositionNSValue* {CGPoint=dd}]QCImageFilter_CIColorControls+,MN]QCImageResize2OPO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameResizepositionNSValue* {CGPoint=dd}? QRST^inputConditionYinputMode''+,VWI\QCExpression2XYZZexpressionO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name "a ? 0 : 2"positionNSValue* {CGPoint=dd}Ya ? 0 : 2+,\]VQCMath^_%2))`f)_numberOfOperations^operationCountabcd[operation_1Yoperand_1He#@ffffffO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}]+,hi]QCImageKerneljklmn2')o)'pq_showSamplerOptions\automaticDODZsourceCode\advancedModeTmain_?/* PDE4 colormap 7 */ kernel vec4 PDE4_colormap_7(sampler image, __color color) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float t3 = i1.g; t2 = 1.0 - t2; float t4 = 1.0 - t3 - 0.5*t2; t4 = (t4 < 0.0) ? 0.0 : t4; vec4 vc = (t4 > t2) ? vec4(1.0 - t4 + t2, 1.0 - t4 + t2, 0.5*(t4-t2), 1.0) : vec4(1.0 - t2 + t4, 1.0, 0.5 * (t2 - t4), 1.0); // Finally multiply by the user's chosen colour and ensure alpha is 1.0 vc = vc * color; vec4 o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } _ /* DYNAMIC VARIABLES 1 - Vec (vector) Creation: "new Vec(number_0, number_1, ...)", take 2 to 4 numerical arguments, or "new Vec(vec)" (does a copy) Properties: x = r = 0, y = g = 1, z = b = 2 = width, w = a = 3 = height 2 - Shape (wrapper over CIFilterShape) Creation: "new Shape(number_0, number_1, number_2, number_3)" or "new Shape(shape)" (does a copy) Properties (all functions return a new Shape) - function intersect(shape) - function union(shape) - function inset(number_x, number_y) - function translate(number_0, number_1) - function scale(number_0, number_1) - function rotate(number_angle) 3 - AffineTransform (wrapper over NSAffineTransform) Creation: "new AffineTransform()" or "new AffineTransform(transform)" (does a copy) Properties returning a new transform: - function scale(scaleXY) or scale(scaleX, scaleY) - function translate(tX, tY) - function invert() - function rotateByDegrees(angle) - function rotateByRadians(angle) - function appendTransform(transform) - function prependTransform(transform) - function setTransformStruct(object) - object has properties m11, m12, ... of NSAffineTransformStruct Properties returning a vector of size 2: - function transformPoint(vector_size_2) - function transformSize(vector_size_2) Property returning an JavaScript object: - property transformStruct - an object with properties m11, m12, ... of NSAffineTransformStruct Settable property: - property transformStruct - takes an object with properties m11, m12, ... of NSAffineTransformStruct 4 - Image Creation: Not allowed. Properties: extent (a Vec of dimension 4), definition (a Shape) 5 - Kernel Creation: Not allowed. The kernels defined in the kernel window are automatically set in the JavaScript context as variables in the kernel name. Properties: - function apply(DOD, ROI_userInfo, arg_1, arg_2, ...) * DOD: A Vec of dimension 4, a Shape or "null" for infinite image * ROI_userInfo: An object that will be passed to the ROI function * arg_x: Arguments given to the kernel - ROIHandler * To set the ROI function * The ROI function, when called, will receive 3 arguments: samplerIndex (an int), dstRect (a Vec of dim 4), and info (passed to the apply function) Example: function myROIFunction(samplerIndex, dstRect, info) { return dstRect; } myKernel.ROIHandler = myROIFunction; STATIC VARIABLES Filter Properties: All Core Image filter under a real (e.g. CISepiaTone) or simplied name (e.g. sepiaTone) Returns a function to apply that filter. The arguments are taken in the order defined at: http://developer.apple.com/documentation/GraphicsImaging/Reference/CoreImageFilterReference Example: var sepiaImage = Filter.sepiaTone(image, 1.0); FUNCTION TO IMPLEMENT function [return_type] main([arg_type_0] arg_0, [arg_type_1] arg_1, ...) [arg_type_x] can be: __image, __vec2, __vec3, __vec4, __color, __number, __index [return_type] must be: __image Must return an image. Example of the "main" function associated to the first kernel in the kernel window and current parameters has been generated below: */ function __image main(__image image, __color color) { return multiplyEffect.apply(image.definition, null, image, color); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 7positionNSValue* {CGPoint=dd}C+,st\QCRangeValue2uvO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}wxy{XinputMaxXinputMinz#@Ç|#?,+6~y89:%;2<')'GHGZinputColor^inputIntensity#?#?#? #?#?O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameInitial U&V inputpositionNSValue* {CGPoint=dd}Y]QCImageFilter_CIColorMonochrome,+6x89:%;2<')'GHGZinputPower#?O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}Y]QCImageFilter]CIGammaAdjust+,WQCPatch/0123_publishedOutputPortswx:\connection_8]connection_15\connection_9\connection_2]connection_16\connection_3\connection_4\connection_5\connection_6\VideoInput_1Xsource_0[outputImage]Multiplexer_2[TextImage_1[outputImage_ImageTransform_1[ImageCrop_2Xsource_1[outputImage[outputImage[ImageCrop_1Xsource_0]Multiplexer_1]AffineClamp_1_Interpolation_2_inputTransform_RotaterZSplitter_3Xsource_1_Interpolation_3_inputTransform_TranslateY_Interpolation_4\inputKerning,2O} streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameError message text[inputString,Vr2Oz streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameFlip Horizontal,2Oq streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameOutput,2O{ streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameRaw Video Output_Raw_Video_OutputO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+ zoomFactorNSNumberNSValue*f scrolling {CGPoint=dd}positionnameVideo Input (Null Protected):Paq+,\QCVideoInput2' ' '''))VheightVuseYUV]cleanAperture[highQualityUwidth_deinterlaceFields^showAutoAdjust_colorCorrection \inputCapture O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}5Q+,]QCMultiplexer2HZinputCountYportClassO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Multiplexer"positionNSValue* {CGPoint=dd}X!]QCGLImagePort+,ZQCSplitter2)O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name (Boolean)positionNSValue* {CGPoint=dd}0]QCBooleanPort+,[QCTextImage2 H_verticalAlignmentXfontSizeVheight_horizontalAlignment\manualLayoutXfontNameUwidthXCentered#@X     ^inputGlyphSize]inputFontName\inputLeadingZinputWidth[inputHeight#@XVFutura##@#@~ O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}+,ZQCSplitter2)O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Splitter"positionNSValue* {CGPoint=dd}0,+6 892%!""O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}sI#$%&'(*,.0_inputTransform_TranslateX_inputTransform_OriginX_inputTransform_ScaleX_inputTransform_ScaleY_inputTransform_OriginY)#?#+#@t-#?/#?1#@n#$%&'(*,.0)+-/1]QCImageFilter_CIAffineTransform,+6;8O2%<==O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}>?@ABDFH_inputRectangle_Z_inputRectangle_X_inputRectangle_Y_inputRectangle_WC#@E#G#I#@~>?@ABDFHCEGIVCICrop+,QR_QCInterpolation0%2S]`))('TVXZ[U#?W#@;Y#H\#1^_ O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}m+,bc_QCInterpolation0%2dnp))('egiklf#@;h#@EQj#;Hm#1o_O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}+,rs_QCInterpolation0%2t~))('uwy{|v#@x#@Q(\z#H}#1_O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}1+,]QCMultiplexer2HO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name Mirror SelectpositionNSValue* {CGPoint=dd}i,+68O2%O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}>?@A#@###@~>?@A,+689:%;2<')'GHG_inputTransform_TranslateY_inputTransform_ScaleY_inputTransform_TranslateX_inputTransform_ScaleX_inputTransform_Rotate_inputTransform_OriginX_inputTransform_OriginY##?####@t#O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}7]QCImageFilter]CIAffineClamp+,]QCImageResize2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}GQRc''+,ZQCSplitter2)O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Splitter"positionNSValue* {CGPoint=dd}`+,]QCImageKerneljklmn2'))'p_/* Colormap 1 from PDE4 */ kernel vec4 PDE4_colormap_1(sampler image, __color color, float diff_color_cutoff) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t1 = /* diff = */ i1.b * diff_color_cutoff + 0.5; t1 = clamp(t1, 0.0, 1.0); float t2 = i1.r; // U float t3 = i1.g; // V vec4 vc = vec4(t1, t2, t3, i1.a) * color; vec4 o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 1positionNSValue* {CGPoint=dd}C)+,]QCMultiplexer23O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Multiplexer"positionNSValue* {CGPoint=dd},+62O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}_QCColorFromComponentsShsl,+62O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}._QCColorToComponents+,/]QCImageKerneljklmn2'))'p_/* PDE4 colormap 8 */ kernel vec4 PDE4_colormap_8(sampler image, __color color) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float t3 = i1.g; vec4 o1 = vec4(0.75 * (1.0 - t3), 0.0, 1.0-t2, 1.0); // Finally multiply by the user's chosen colour and ensure alpha is 1.0 vec4 vc = vec4(o1.r, o1.g, o1.b, 1.0) * color; o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 8positionNSValue* {CGPoint=dd}D+,]QCImageKerneljklmn2'))'p_4/* PDE4 colormap 17 */ vec4 go_hsv2rgba(float h, float s, float v, float a) { float i = floor(h); int ii = int(i); float f = h - i; float p = v * (1.0 - s); float q = v * (1.0 - s * f); float t = v * (1.0 - s * (1.0 - f)); vec4 rgba = (s <= 0.0) ? vec4(v, v, v, a) : ((ii == 0) ? vec4(v, t, p, a) : ((ii == 1) ? vec4(q, v, p, a) : ((ii == 2) ? vec4(p, v, t, a) : ((ii == 3) ? vec4(p, q, v, a) : ((ii == 4) ? vec4(t, p, v, a) : vec4(v, p, q, a) ))))); return rgba; } kernel vec4 PDE4_colormap_17(sampler image, __color color, float diff_color_cutoff) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float diff = (i1.b - 0.5) * diff_color_cutoff + 0.5; diff = i1.b; diff = clamp(diff, 0.0, 1.0); float t1 = 0.25 + diff * 0.6; float t4 = 1.0 - t2; t4 = mod(t4 + 1.98, 1.0); // ; t4 = t4 - floor(t4); vec4 vc = go_hsv2rgba(6.0 * t4, t1, 0.38 + 0.5*t2, 1.0) * color; vec4 o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 17positionNSValue* {CGPoint=dd}Ca+,]QCImageKerneljklmn2'))'p_'/* Colormap 0 from PDE4 */ kernel vec4 PDE4_colormap_0(sampler image, __color color) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float t3 = i1.g; vec4 o1; vec4 vc = vec4(t2, t3, t2, i1.a) * color; o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 0positionNSValue* {CGPoint=dd}C+,v]QCImageKerneljklmn2'))'p_/* PDE4 colormap 5 */ kernel vec4 PDE4_colormap_5(sampler image, __color color) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float t3 = i1.g; t2 = 1.0 - t2; float t4 = 1.0 - t3 - 0.5*t2; t4 = (t4 < 0.0) ? 0.0 : t4; vec4 vc = (t4 > t2) ? vec4(t4 - t2, t4 - t2, t2 - t4 + 1.0, 1.0) : vec4(t2 - t4, t4 - t2 + 1.0, t4 - t2 + 1.0, 1.0); vc = vc * color; vec4 o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 5positionNSValue* {CGPoint=dd}Ce+,]QCImageKerneljklmn2'))'p_/* lime, a corruption of PDE4 colormap 5 */ kernel vec4 colormap_keylime(sampler image, __color color) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float t3 = i1.g; t2 = 1.0 - t2; float t4 = 1.0 - t3 - 0.5*t2; t4 = (t4 < 0.0) ? 0.0 : t4; vec4 vc = (t4 > t2) ? vec4(t4 - t2, t4 + t2, 0.5*(t4-t2), 1.0) : vec4(1.0 - t2 + t4, 1.0, 0.5 * (t2 - t4), 1.0); vc = vc * color; vec4 o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namecolormap KeylimepositionNSValue* {CGPoint=dd}E+,]QCImageKerneljklmn2'))'p_0/* PDE4 colormap 12 */ vec4 go_hsv2rgba(float h, float s, float v, float a) { float i = floor(h); int ii = int(i); float f = h - i; float p = v * (1.0 - s); float q = v * (1.0 - s * f); float t = v * (1.0 - s * (1.0 - f)); vec4 rgba = (s <= 0.0) ? vec4(v, v, v, a) : ((ii == 0) ? vec4(v, t, p, a) : ((ii == 1) ? vec4(q, v, p, a) : ((ii == 2) ? vec4(p, v, t, a) : ((ii == 3) ? vec4(p, q, v, a) : ((ii == 4) ? vec4(t, p, v, a) : vec4(v, p, q, a) ))))); return rgba; } kernel vec4 PDE4_colormap_12(sampler image, __color color, float diff_color_cutoff) { vec2 c = samplerCoord(image); vec4 i1 = sample(image, c); float t2 = i1.r; float diff = i1.b * diff_color_cutoff + 0.5; diff = (diff > 1.0) ? 1.0 : ((diff < 0.0) ? 0.0 : diff); float t1 = 0.25 + diff * 0.75; // Finally multiply by the user's chosen colour and ensure alpha is 1.0 vec4 vc = go_hsv2rgba(4.8 * t2, t1, t2, 1.0) * color; vec4 o1 = vec4(vc.r, vc.g, vc.b, 1.0); return o1; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namePDE4 colormap 12positionNSValue* {CGPoint=dd}A%+,XQCSprite2'\antialiasingO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameP-in-P DisplaypositionNSValue* {CGPoint=dd} VinputZVinputX\inputZBuffer]inputBlending\inputCullingWinputRZWinputRYZinputColorWinputRX##=p =')'# #   #?#?ff`#?#?#+,WQCPatch/023&)*V !"#$]connection_22]connection_18]connection_16]connection_21illboard_2_ColorFromComponents_rgb_1]ImageResize_2ef"%\outputHeight4' O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+ zoomFactorNSNumberNSValue*f scrolling {CGPoint=dd}@h}@position nameCredits+J\ej{+,,-[QCTextImage%2./=HI#?t"    024579;1#?t"3o5PDE5 2010 Robert Munafo - mrob.com/pub/comp/xmorphia6#8#:#@@<#>?@AB7059;\inputKerning^inputGlyphSize\inputLeadingZinputWidth[inputHeight816:<O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}+,KLCBillboard2MWZNOQS)P#R#4X O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}X+,]^]QCImageResize2_`O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd} cQRacdbx')+,fg\QCScreenInfo2h O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}? +,kl_QCInterpolation0%2mwz))('nprtuo#q#@(s#?'v#1xyO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd} :,+6|2}~O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}K##?#?_QCColorFromComponentsSrgb+,VQCMath^_%2)))[operation_1Yoperand_1H#O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}`WPatch_1+,\QCScreenInfo2 O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namerddpositionNSValue* {CGPoint=dd} +,ZQCSplitter%2)_customOutputPortStates\QCNumberPort2O{ streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namebig pixmap width2O{ streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namebig pixmap widthO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namebig pixmap widthpositionNSValue* {CGPoint=dd}+,ZQCSplitter2)O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namebig pixmap heightpositionNSValue* {CGPoint=dd}\QCNumberPort+,3ZQCSplitter2)O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Boolean Splitter"positionNSValue* {CGPoint=dd}]QCBooleanPort+,BWQCPatch/123\connection_7]connection_57]connection_10\connection_8\connection_1\connection_9]connection_58\connection_2\connection_3\connection_4]connection_55\connection_5\connection_6VMath_1_inputTransform_TranslateY]AffineClamp_2VMath_2_inputTransform_ScaleYZSplitter_4Yoperand_1VMath_3Yoperand_1ZSplitter_1ZSplitter_5>Yoperand_2AZSplitter_2_inputTransform_ScaleXYoperand_1,o2Ox streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name desired Width,S2Oy streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namedesired height,2Ov streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name input Width#@[input_Width,2Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name input Height#@~\input_HeightCO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+noteListNSMutableArrayNSArrayboundsNSValue* {CGRect={CGPoint=dd}{CGSize=dd}}y7string;Create wider cropped scaled version of 640x480 iSight inputcolorNSColorcffff? zoomFactorNSNumberf scrolling {CGPoint=dd}x|@name,Resize with crop or letterbox (fit by width)position1'2>J+,VQCMath^_%2)))[operation_1O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameA/640positionNSValue* {CGPoint=dd}&,+689:%;2<')'GHG_inputTransform_TranslateX_inputTransform_Rotate_inputTransform_OriginX_inputTransform_OriginY####O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}l]QCImageFilter,+6 8O2%   O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}?@  ##?@  +,VQCMath^_%2HH)[operation_1[operation_2HO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name(A-B1)/2positionNSValue* {CGPoint=dd}+,ZQCSplitter%2 #&)\QCNumberPort!2"Ot streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out Width$2%Ot streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out WidthO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out WidthpositionNSValue* {CGPoint=dd}+,()ZQCSplitter%2*+.1)\QCNumberPort,2-Ou streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out Height/20Ou streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out HeightO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out HeightpositionNSValue* {CGPoint=dd}+,34VQCMath^_%2HH5=)6789:;[operation_1[operation_2Yoperand_2)<#@O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name(A-B1)/2positionNSValue* {CGPoint=dd})+,?@ZQCSplitter%2ABEI)\QCNumberPortC2DOs streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein WidthF2GHOs streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein Width#@O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein WidthpositionNSValue* {CGPoint=dd}+,KLZQCSplitter%2MNQU)\QCNumberPortO2POt streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name in HeightR2STOt streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name in Height#@~O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name in HeightpositionNSValue* {CGPoint=dd}+,WX?]QCImageKernelj%klmn2)Y)a)'bcZ[\]^_]live-WrapMode_live-FilterModeUstyle')`#?__/* Convert an RGB signal (with components that range from 0 to 1) into a range of F and k parameter values suitable for a Gray-Scott reaction-diffusion system. The "style" param should be 0 for the original 1-D parametrization in which all k values are 0.055 and F ranges from 0.02 to 0.04 by the input green component; style 1 selects an experimental 2-D parametrization based on red and blue. input: r \ output: r F parameter value g |video g k parameter value b / image b 0 (unused) a a 1 (presently unused) */ kernel vec4 gray_scott(sampler live, float style) { vec2 c = samplerCoord(live); vec3 live_video = sample(live, c); // the 2nd style didn't work at all so I'm not even including it in the // code // F = 0.02 + 0.02*live_video.r; // k = 0.057 + 0.007 * (live_video.r - live_video.b); // 3rd style // F = 0.02 + 0.02 * live_video.b; // 3rd style // k = 0.056 + 0.004 * live_video.r; // 3rd attempt float F = (style < 0.5) ? 0.02 + 0.02 * live_video.g // original : 0.04 - 0.02 * live_video.b; // 4th style float k = (style < 0.5) ? 0.055 // original : 0.06 - 0.004 * live_video.r; // 4th attempt vec4 retval = vec4(F, k, 0.0, 1.0); return(retval); } _ /* DYNAMIC VARIABLES 1 - Vec (vector) Creation: "new Vec(number_0, number_1, ...)", take 2 to 4 numerical arguments, or "new Vec(vec)" (does a copy) Properties: x = r = 0, y = g = 1, z = b = 2 = width, w = a = 3 = height 2 - Shape (wrapper over CIFilterShape) Creation: "new Shape(number_0, number_1, number_2, number_3)" or "new Shape(shape)" (does a copy) Properties (all functions return a new Shape) - function intersect(shape) - function union(shape) - function inset(number_x, number_y) - function translate(number_0, number_1) - function scale(number_0, number_1) - function rotate(number_angle) 3 - AffineTransform (wrapper over NSAffineTransform) Creation: "new AffineTransform()" or "new AffineTransform(transform)" (does a copy) Properties returning a new transform: - function scale(scaleXY) or scale(scaleX, scaleY) - function translate(tX, tY) - function invert() - function rotateByDegrees(angle) - function rotateByRadians(angle) - function appendTransform(transform) - function prependTransform(transform) - function setTransformStruct(object) - object has properties m11, m12, ... of NSAffineTransformStruct Properties returning a vector of size 2: - function transformPoint(vector_size_2) - function transformSize(vector_size_2) Property returning an JavaScript object: - property transformStruct - an object with properties m11, m12, ... of NSAffineTransformStruct Settable property: - property transformStruct - takes an object with properties m11, m12, ... of NSAffineTransformStruct 4 - Image Creation: Not allowed. Properties: extent (a Vec of dimension 4), definition (a Shape) 5 - Kernel Creation: Not allowed. The kernels defined in the kernel window are automatically set in the JavaScript context as variables in the kernel name. Properties: - function apply(DOD, ROI_userInfo, arg_1, arg_2, ...) * DOD: A Vec of dimension 4, a Shape or "null" for infinite image * ROI_userInfo: An object that will be passed to the ROI function * arg_x: Arguments given to the kernel - ROIHandler * To set the ROI function * The ROI function, when called, will receive 3 arguments: samplerIndex (an int), dstRect (a Vec of dim 4), and info (passed to the apply function) Example: function myROIFunction(samplerIndex, dstRect, info) { return dstRect; } myKernel.ROIHandler = myROIFunction; STATIC VARIABLES Filter Properties: All Core Image filter under a real (e.g. CISepiaTone) or simplied name (e.g. sepiaTone) Returns a function to apply that filter. The arguments are taken in the order defined at: http://developer.apple.com/documentation/GraphicsImaging/Reference/CoreImageFilterReference Example: var sepiaImage = Filter.sepiaTone(image, 1.0); FUNCTION TO IMPLEMENT function [return_type] main([arg_type_0] arg_0, [arg_type_1] arg_1, ...) [arg_type_x] can be: __image, __vec2, __vec3, __vec4, __color, __number, __index [return_type] must be: __image Must return an image. Example of the "main" function associated to the first kernel in the kernel window and current parameters has been generated below: */ function __image main(__image image) { return gray_scott.apply(image.definition, null, image); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameconvert RGB to k&FpositionNSValue* {CGPoint=dd}1+,ef]QCImageKernelj%klmn2)g)l))mnhijk_image-FilterMode^image-WrapMode)'_H/* Convert an RGB signal (with components that range from 0 to 1) into a range of u/v tuples suitable as an initial Gray-Scott pattern in the region around k=0.058, F ranging from 0.02 to 0.04. input: r \ output: r u g |video g v b / image b 0 (unused) a a 1 (presently unused) */ kernel vec4 initial_UV(sampler live, float width, float height) { vec2 c = samplerCoord(live); vec3 live_video = sample(live, c); vec2 dc = destCoord(); /* This is the luma (Y) component of a RGB to YUV transform */ vec3 rgb_luminance = vec3(0.30, 0.59, 0.11); float val = dot(rgb_luminance, live_video); /* double the contrast to make the image a little more surreal; add a gradient that varies by height. */ val = mod(2.7*val + 1.0 - dc.y/height, 1.0); /* Map the values (0.0 .. 1.0) in a parametrized way onto (u,v) tuples from [(0.3, 0.3) .. (1.0, 0.0)] */ float u = 0.3 + 0.7 * val; float v = 0.3 * (1.0 - val); vec4 retval = vec4(u, v, 0.0, 1.0); return(retval); } _function __image main(__image image, __number width, __number height) { return initial_UV.apply(image.definition, null, image, width, height); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namekernel - initial U&VpositionNSValue* {CGPoint=dd},+6pu89:%;2<')'qGHtGrs#?fffO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}X]QCImageFilter+,wx;\QCFPSDisplay2yzO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}{|YinputMode'+,~WQCPatch/123"$%$]connection_20]connection_16]connection_11]connection_50\connection_5]connection_28]connection_67]connection_23]connection_19]connection_14]connection_53]connection_49\connection_1]connection_26]connection_17]connection_21]connection_12]connection_51\connection_7]connection_29]connection_68]connection_24]connection_15]connection_10\connection_3]connection_27]connection_66]connection_22]connection_61\connection_6]connection_13]connection_18]connection_52\connection_9\connection_2rZSplitter_9]Multiplexer_2]ImageKernel_2Xloopback]ImageKernel_4]ImageKernel_1XF_k_grid]ImageKernel_7ZSplitter_6\total_heightXsource_1ZSplitter_8Xscale_du]ImageKernel_6[inputHeight_ImageAccumulator_1Xscale_du^ImageKernel_10Xloopback]ImageKernel_5]ImageKernel_3XloopbackZSplitter_3Tin_kZSplitter_4[total_widthZSplitter_7Xlive_x_yXF_k_gridXF_k_gridXsource_2ZSplitter_5Wfk_sizeZSplitter_1TmodeXloopback^ImageKernel_12Xscale_du_inputDirtyHeightXsource_0XloopbackXF_k_gridXF_k_gridXloopback_inputDirtyWidthXsource_1ZinputWidthXloopback[outputImageXF_k_gridXF_k_gridZSplitter_2Tin_FXF_k_gridXloopback  ,@2Oy streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namek-F parameters,2Op streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameWidth,2Oq streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameHeight,   2 Oz streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameInitial U and VXsource_0,r2Ou streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name Init / Run,2Or streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namekF mode,k2Oo streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_F,i2Oo streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_k,2Op streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_sz,2Os streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namescale_du, 2!Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name its/fr index#LO` streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+ scrollingNSValue* {CGPoint=dd}@r zoomFactorNSNumberfname!Gray-Scott (8-stage Euler method)noteListNSMutableArrayNSArraystringGenerate a grid of k and F parameter values based either on live video input or on the mode, in_F, in_k, in_sz settings used to generate constant-parameter views or a parameter-space map.bounds {CGRect={CGPoint=dd}{CGSize=dd}}colorNSColorcffff?Pixel format (8, 16 or 32 bits) of this accumulator determines the precision of all of the iteration steps, which affects the frame rate. 8 isn't accurate enough.boundsy?position&:>M\kv +,'(_QCImageAccumulator)*2+,- 8)9_accumulatorFormat_accumulatorContinuousVRGBA16./0135_inputDirtyOriginX_inputAccumulate_inputDirtyOriginY2# 6# 0O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namelatchpositionNSValue* {CGPoint=dd}]+,;<]QCMultiplexer2=HO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiplexerpositionNSValue* {CGPoint=dd}+,?@]QCImageKernelj%klmn2)A)J))KLBCDEFGHI_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); return(vec4(new_uv.x, new_uv.y, 0.0, 1.0)); } _\function myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}m+,NO]QCImageKernelj%klmn2)P)Y))Z[QRSTUVWX_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_0/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid, float scale_du) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); float du_out = -1.0 * scale_du * vdt.x * duv.x; du_out = clamp(0.5 + du_out, 0.0, 1.0); vec4 retval = vec4(new_uv.x, new_uv.y, du_out, 1.0); return(retval); } _yfunction myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid, __number scale_du) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid, scale_du); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}n+,]^]QCImageKernelj%klmn2)_)h))ij`abcdefg_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); return(vec4(new_uv.x, new_uv.y, 0.0, 1.0)); } _\function myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}+,lmZQCSplitter%2noru)\QCNumberPortp2qOp streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameWidths2tOp streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameWidthO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameWidthpositionNSValue* {CGPoint=dd}{+,wxZQCSplitter%2yz})\QCNumberPort{2|Oq streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameHeight~2Oq streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameHeightO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameHeightpositionNSValue* {CGPoint=dd}x+,ZQCSplitter%2)2Ot streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name x-y image2Ot streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name x-y imageO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name x-y imagepositionNSValue* {CGPoint=dd}j+,ZQCSplitter%2)\QCNumberPort2Or streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namekF mode2Or streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namekF modeO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namekF modepositionNSValue* {CGPoint=dd}j,+,ZQCSplitter%2)\QCNumberPort2Oo streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_F2Oo streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_FO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_FpositionNSValue* {CGPoint=dd}z8+,ZQCSplitter%2)\QCNumberPort2Oo streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_k2Oo streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_kO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_kpositionNSValue* {CGPoint=dd}{D+,ZQCSplitter%2)\QCNumberPort2Op streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_sz2Op streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_szO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein_szpositionNSValue* {CGPoint=dd}uP+,ZQCSplitter%2)\QCNumberPort2Os streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namescale_du2Os streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namescale_duO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namescale_dupositionNSValue* {CGPoint=dd}|+,]QCImageKernelj%klmn2))))_live_x_y-WrapMode_live_x_y-FilterMode))_/* Convert video input and/or static k-F parametrization into a grid of k and F values. live r F I g k I b - - a - - Parameters mode, in_F, in_k, fk_size determine how the k and F params are computed for each pixel. Available options are: mode == 0.0, then F is in_F and k is in_k mode == 0.1, then F and k come from live video input mode == 0.2, then F and k are determined by x and y coordinates (parameter map plot) according to the rules: F,k for central pixel are given by in_F and in_k variation in F = fk_size, var. in k = 0.8 * fk_size */ kernel vec4 make_k_F(sampler live_x_y, float mode, float in_F, float in_k, float fk_size, float total_width, float total_height) { vec2 c = samplerCoord(live_x_y); /* Perform the calculations used to select the parameters k and F */ vec4 live_video = sample(live_x_y, c); vec2 dc = destCoord(); vec2 dsz = vec2(total_width, total_height); vec2 so = dc / dsz - 0.5; float F = in_F + fk_size * so.y; // 0.2 case F = (mode < 0.15) ? live_video.x : F; // 0.1 case F = (mode < 0.05) ? in_F : F; // 0.0 case float k = in_k + 0.8 * fk_size * so.x; // 0.2 case k = (mode < 0.15) ? live_video.y : k; // 0.1 case k = (mode < 0.05) ? in_k : k; // 0.0 case vec4 retval = vec4(F, k, 0.0, 1.0); return(retval); } _ function __image main(__image live_x_y, __number mode, __number in_F, __number in_k, __number fk_size, __number total_width, __number total_height) { return make_k_F.apply(live_x_y.definition, null, live_x_y, mode, in_F, in_k, fk_size, total_width, total_height); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namemode to k-F matrixpositionNSValue* {CGPoint=dd}+,]QCImageKernelj%klmn2))))_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); return(vec4(new_uv.x, new_uv.y, 0.0, 1.0)); } _\function myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}jA+,]QCImageKernelj%klmn2))))_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); return(vec4(new_uv.x, new_uv.y, 0.0, 1.0)); } _\function myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}l+,]QCImageKernelj%klmn2))))_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); return(vec4(new_uv.x, new_uv.y, 0.0, 1.0)); } _\function myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}m+,]QCMultiplexer2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Multiplexer"positionNSValue* {CGPoint=dd}Z+,ZQCSplitter2 )XinputMax[indexLabels\QCNumberPort#@^Once per Frame\3x per Frame\8x per FrameO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Number Splitter"positionNSValue* {CGPoint=dd}H+,  ]QCImageKernelj%klmn2) )))_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_0/* Full comments in first copy of kernel. */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid, float scale_du) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); float du_out = -1.0 * scale_du * vdt.x * duv.x; du_out = clamp(0.5 + du_out, 0.0, 1.0); vec4 retval = vec4(new_uv.x, new_uv.y, du_out, 1.0); return(retval); } _yfunction myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid, __number scale_du) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid, scale_du); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd}+,]QCImageKernelj%klmn2))%))&' !"#$_loopback-FilterMode_F_k_grid-FilterMode_F_k_grid-WrapMode_loopback-WrapMode))))_k/* Gray-Scott reaction diffusion system. See mrob.com/sci One should feed the output of this kernel back into the "loopback" input, and a grid of F and k values in the "F_k_grid" input. loopback r U I/O F_k_grid r F I g V I/O g k I b Du O b - - a - - a - - */ kernel vec4 gray_scott(sampler loopback, sampler F_k_grid, float scale_du) { vec2 c = samplerCoord(loopback); vec2 uv = sample(loopback, c); vec2 up_rt = c + 1.0; vec2 dn_lt = c - 1.0; vec2 d_orth = sample(loopback, vec2(c.x, up_rt.y)) + sample(loopback, vec2(c.x, dn_lt.y)) + sample(loopback, vec2(up_rt.x, c.y)) + sample(loopback, vec2(dn_lt.x, c.y)); vec2 d_diag = sample(loopback, vec2(up_rt.x, up_rt.y)) + sample(loopback, vec2(up_rt.x, dn_lt.y)) + sample(loopback, vec2(dn_lt.x, up_rt.y)) + sample(loopback, vec2(dn_lt.x, dn_lt.y)); // 9-point stencil vec2 del = (0.667 * d_orth) + (0.167 * d_diag) - (3.336 * uv); /* Get the parameters k and F (calculated by a separate kernel) */ vec2 F_k = sample(F_k_grid, c); vec2 Du_Dv = vec2(2.0e-5, 1.0e-5); // "Pearson" model from PDE4 vec2 vdt = vec2(1.4, 1.4); // 9-point stencil supports higher delta-t vec2 vdxy = vec2(2.5/256.0, 2.5/256.0); /* Compute derivative and new values of u,v using Euler method */ vec2 del = Du_Dv * del / (vdxy * vdxy); vec2 u_spl = uv.xx; vec2 v_spl = uv.yy; vec2 K_m1_1 = vec2(-1.0, 1.0); vec2 v_m1_v = vec2(-1.0, uv.y); vec2 F_spl = F_k.xx; vec2 duv = del + K_m1_1*u_spl*v_spl*v_spl - F_spl*v_m1_v - F_k*uv; vec2 new_uv = clamp(uv + vdt * duv, 0.0, 1.0); float du_out = -1.0 * scale_du * vdt.x * duv.x; du_out = clamp(0.5 + du_out, 0.0, 1.0); vec4 retval = vec4(new_uv.x, new_uv.y, du_out, 1.0); return(retval); } _yfunction myROIFunction(samplerIndex, dstRect, info) { var r2 = new Vec(dstRect.x-1.0, dstRect.y-1.0, dstRect.width+2.0, dstRect.height+2.0); return r2; // dstRect; } function __image main(__image loopback, __image F_k_grid, __number scale_du) { gray_scott.ROIHandler = myROIFunction; return gray_scott.apply(loopback.definition, null, loopback, F_k_grid, scale_du); } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name multiply-parametrized Gray-ScottpositionNSValue* {CGPoint=dd},+6)|42*+O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name F620 k609positionNSValue* {CGPoint=dd}a,.02-#/#?1#?vȴ9X3#?.H_QCColorFromComponents,+66h827O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameunpack mode/k/F/szpositionNSValue* {CGPoint=dd} _QCColorToComponents,+6:E2;#?@#?B#D#_QCColorFromComponents,+6GR2HIO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameParameter Space PlotpositionNSValue* {CGPoint=dd}~JLNPK#?əM#?QO#?QQ#?Q_QCColorFromComponents+,TU]QCMultiplexer2VWO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Color Multiplexer"positionNSValue* {CGPoint=dd}" [QCColorPort+,YZqZQCSplitter2[\]b)[QCIndexPort#@^_`a_Video-Parametrized_Param Space View\Uskate-WorldWMitosisO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Index Splitter"positionNSValue* {CGPoint=dd}+,deZQCSplitter%2fgjn)\QCNumberPorth2iO| streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameDIFF_COLOR_CUTOFFk2lmO| streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameDIFF_COLOR_CUTOFF#@O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameDIFF_COLOR_CUTOFFpositionNSValue* {CGPoint=dd}+,pqVQCMath^_%2HHrw)stuv[operation_1[operation_2HO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd} +,yzZQCSplitter%2{|)\QCNumberPort}2~Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name P-in-P width2Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name P-in-P width#?zG{O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name P-in-P widthpositionNSValue* {CGPoint=dd} +,VQCMath^_%2)))[operation_1Yoperand_1H#O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}m,+62O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name F350 k650positionNSValue* {CGPoint=dd}##?#?Q#? =p_QCColorFromComponents+,,]QCMultiplexer2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameSB WidthpositionNSValue* {CGPoint=dd}\QCNumberPort+,]QCMultiplexer2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name SB HeightpositionNSValue* {CGPoint=dd}\QCNumberPort+,ZQCSplitter2)[QCIndexPort#@THalfVNormalVDoubleO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Index Splitter"positionNSValue* {CGPoint=dd}ed+,\QCJavaScript2)'')WnewMode^numberOfInputsVscript_numberOfOutputs_v/* Scale a width and height by 1/2, for use as the "smaller bitmaps" size, but in any case always return an even number in both directions. This allows really lame graphics cards to subdivide the texture into 4 smaller work units if needed. */ function (__number out_width, __number out_height) main (__number in_width, __number in_height) { var result = new Object(); var wid_4, hei_4; wid_4 = Math.floor(in_width / 4 + 0.5); hei_4 = Math.floor(in_height / 4 + 0.5); result.out_width = 2 * wid_4; // Math.floor(in_width / 2); result.out_height = 2 * hei_4; // Math.floor(in_height / 2); return result; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namenearest even half-sizepositionNSValue* {CGPoint=dd}*+,ZQCSplitter%2)\QCNumberPort2Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name pixmap width2Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name pixmap widthO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name pixmap widthpositionNSValue* {CGPoint=dd}+,ZQCSplitter%2)\QCNumberPort2Ox streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name pixmap height2Ox streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name pixmap heightO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name pixmap heightpositionNSValue* {CGPoint=dd}+,ZQCSplitter%2)\QCNumberPort#?O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name1positionNSValue* {CGPoint=dd}+,\QCJavaScript2)'')_C/* Scale a width and height by 1/6, always returning an integer. */ function (__number out_width, __number out_height) main (__number in_width, __number in_height) { var result = new Object(); result.out_width = Math.floor(in_width / 6 + 0.5); result.out_height = Math.floor(in_height / 6 + 0.5); return result; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namedivide w/h by 6positionNSValue* {CGPoint=dd}D+, \QCScreenInfo2 O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namerddpositionNSValue* {CGPoint=dd}E- +,WQCPatch/123 "#   \connection_7]connection_57]connection_10\connection_8\connection_1\connection_9]connection_58\connection_2\connection_3\connection_4]connection_55\connection_5\connection_6VMath_1_inputTransform_TranslateY]AffineClamp_2VMath_2_inputTransform_ScaleYZSplitter_4Yoperand_1VMath_3Yoperand_1ZSplitter_1ZSplitter_5[ImageCrop_2>Yoperand_2AZSplitter_2 _inputTransform_ScaleX Yoperand_1,2Ox streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name desired Width,P2Oy streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namedesired height,2Ov streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name input Width#@[input_Width,2Ow streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name input Height#@~\input_Height!6O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+noteListNSMutableArrayNSArrayboundsNSValue* {CGRect={CGPoint=dd}{CGSize=dd}}y7string;Create wider cropped scaled version of 640x480 iSight inputcolorNSColorcffff? zoomFactorNSNumberf scrolling {CGPoint=dd}x|@name,Resize with crop or letterbox (fit by width)positioni$+<GP[fr~+,%&VQCMath^_%2))'*)()[operation_1O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameA/640positionNSValue* {CGPoint=dd}&,+6,;89:%;2<')'-GH:G./012468_inputTransform_TranslateX_inputTransform_Rotate_inputTransform_OriginX_inputTransform_OriginY3#5#7#9#O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}l]QCImageFilter,+6=8O2%>??O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}?@@BA#C#?@@BAC+,HIVQCMath^_%2HHJO)KLMN[operation_1[operation_2HO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name(A-B1)/2positionNSValue* {CGPoint=dd}+,QRZQCSplitter%2STWZ)\QCNumberPortU2VOt streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out WidthX2YOt streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out WidthO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out WidthpositionNSValue* {CGPoint=dd}+,\]ZQCSplitter%2^_be)\QCNumberPort`2aOu streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out Heightc2dOu streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out HeightO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name out HeightpositionNSValue* {CGPoint=dd}+,ghVQCMath^_%2HHiq)jklmno[operation_1[operation_2Yoperand_2)p#@O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name(A-B1)/2positionNSValue* {CGPoint=dd})+,stZQCSplitter%2uvy})\QCNumberPortw2xOs streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein Widthz2{|Os streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein Width#@O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namein WidthpositionNSValue* {CGPoint=dd}+,ZQCSplitter%2)\QCNumberPort2Ot streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name in Height2Ot streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name in Height#@~O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name in HeightpositionNSValue* {CGPoint=dd}+,\QCJavaScript2)'')_/* Return the nearest multiple of 4. This is to help the render pipeline tile the texture in cases where the display size is too big to do it all in one operation. */ function (__number out_width, __number out_height) main (__number in_width, __number in_height) { var result = new Object(); var wid_4, hei_4; wid_4 = Math.floor(in_width / 4 + 0.5); hei_4 = Math.floor(in_height / 4 + 0.5); result.out_width = 4 * wid_4; result.out_height = 4 * hei_4; return result; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namenearest multiple of 4positionNSValue* {CGPoint=dd}-+,WQCPatch/123\connection_2^connection_114^connection_109\connection_3^connection_100^connection_108\connection_1\ImagePixel_1SminYoutputRed^ImageKernel_11ZSplitter_3Tlive]ImageKernel_3Tlive^ImageKernel_10Smax[outputGreen]ImageResize_2Tlive,2Op streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameinput,2Oq streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameoutputO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+ zoomFactorNSNumberNSValue*fnameequalize contrast scrolling {CGPoint=dd}H|@8position1+,]QCImageKernelj%klmn2))))]live-WrapMode_live-FilterMode')_/* Determine the min and max value of image samples in rows (which must be 16 pixels wide) */ kernel vec4 mm_row(sampler live) { vec2 c = samplerCoord(live); vec4 pix = sample(live, c); /* This is the luma (Y) component of a RGB to YUV transform */ vec4 rgb_luminance = vec4(0.30, 0.59, 0.11, 0.0); float val = dot(rgb_luminance, pix); float min = val; float max = val; float i; for(i=0.5; i<16.0; i+=1.0) { pix = sample(live, vec2(i, c.y)); val = dot(rgb_luminance, pix); // 0.3 * pix.r + 0.59 * pix.g + 0.11 * pix.b; min = clamp(val, 0.0, min); max = clamp(val, max, 1.0); } vec4 retval = vec4(min, max, 0.0, 1.0); return(retval); } __function __image main(__image live) { return mm_row.apply(live.definition, null, live); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namemax-min each rowpositionNSValue* {CGPoint=dd};+,]QCImageResize2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameresize to 16x16positionNSValue* {CGPoint=dd}lQRc''+,]QCImageKernelj%klmn2))))]live-WrapMode_live-FilterMode')_/* Determine the min and max value of image samples in rows (which must be 16 pixels wide) */ kernel vec4 mm_cols(sampler live) { vec2 c = samplerCoord(live); vec4 pix = sample(live, c); float min = pix.r; float max = pix.g; float i; for(i=0.5; i<16.0; i+=1.0) { pix = sample(live, vec2(c.x, i)); min = clamp(pix.r, 0.0, min); max = clamp(pix.g, max, 1.0); } vec4 retval = vec4(min, max, 0.0, 1.0); return(retval); } _`function __image main(__image live) { return mm_cols.apply(live.definition, null, live); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namemax-min each columnpositionNSValue* {CGPoint=dd}+,]QCImageKernelj%klmn2))))]live-WrapMode_live-FilterMode')_M/* Determine the min and max value of image samples in rows (which must be 16 pixels wide) */ kernel vec4 contrast(sampler live, float min, float max) { vec2 c = samplerCoord(live); vec4 pix = sample(live, c); pix = (pix - min) / (max - min + 0.001); pix = clamp(pix, 0.0, 1.0); return(vec4(pix.r, pix.g, pix.b, 1.0)); } _function __image main(__image live, __number min, __number max) { return contrast.apply(live.definition, null, live, min, max); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+nameequalize contrastpositionNSValue* {CGPoint=dd})+,ZQCSplitter2)O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Splitter"positionNSValue* {CGPoint=dd}/D+,\QCImagePixel2O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+positionNSValue* {CGPoint=dd}A_inputColorSpace[inputPixelX[inputPixelY'#@ #@ +,]QCImageKerneljklmn2'))'_/* Convert an RGB signal (with components that range from 0 to 1) into a range of u/v tuples suitable as an initial Gray-Scott pattern in the region around k=0.058, F ranging from 0.02 to 0.04. input: r \ output: r u g |video g v b / image b 0 (unused) a a 1 (presently unused) */ kernel vec4 gray_scott_initial_UV(sampler live) { vec2 c = samplerCoord(live); vec3 live_video = sample(live, c); /* This is the luma (Y) component of a RGB to YUV transform */ vec3 rgb_luminance = vec3(0.30, 0.59, 0.11); float val = dot(rgb_luminance, live_video); /* artificial contrast enhancement to produce a useful image even when the image is fairly dark */ val = mod(7.0 * val, 1.0); /* Map the values (0.0 .. 1.0) in a parametrized way onto (u,v) tuples from [(0.3, 0.3) .. (1.0, 0.0)] */ float u = 0.3 + 0.7 * val; float v = 0.3 * (1.0 - val); vec4 retval = vec4(u, v, 0.0, 1.0); return(retval); } _ /* DYNAMIC VARIABLES 1 - Vec (vector) Creation: "new Vec(number_0, number_1, ...)", take 2 to 4 numerical arguments, or "new Vec(vec)" (does a copy) Properties: x = r = 0, y = g = 1, z = b = 2 = width, w = a = 3 = height 2 - Shape (wrapper over CIFilterShape) Creation: "new Shape(number_0, number_1, number_2, number_3)" or "new Shape(shape)" (does a copy) Properties (all functions return a new Shape) - function intersect(shape) - function union(shape) - function inset(number_x, number_y) - function translate(number_0, number_1) - function scale(number_0, number_1) - function rotate(number_angle) 3 - AffineTransform (wrapper over NSAffineTransform) Creation: "new AffineTransform()" or "new AffineTransform(transform)" (does a copy) Properties returning a new transform: - function scale(scaleXY) or scale(scaleX, scaleY) - function translate(tX, tY) - function invert() - function rotateByDegrees(angle) - function rotateByRadians(angle) - function appendTransform(transform) - function prependTransform(transform) - function setTransformStruct(object) - object has properties m11, m12, ... of NSAffineTransformStruct Properties returning a vector of size 2: - function transformPoint(vector_size_2) - function transformSize(vector_size_2) Property returning an JavaScript object: - property transformStruct - an object with properties m11, m12, ... of NSAffineTransformStruct Settable property: - property transformStruct - takes an object with properties m11, m12, ... of NSAffineTransformStruct 4 - Image Creation: Not allowed. Properties: extent (a Vec of dimension 4), definition (a Shape) 5 - Kernel Creation: Not allowed. The kernels defined in the kernel window are automatically set in the JavaScript context as variables in the kernel name. Properties: - function apply(DOD, ROI_userInfo, arg_1, arg_2, ...) * DOD: A Vec of dimension 4, a Shape or "null" for infinite image * ROI_userInfo: An object that will be passed to the ROI function * arg_x: Arguments given to the kernel - ROIHandler * To set the ROI function * The ROI function, when called, will receive 3 arguments: samplerIndex (an int), dstRect (a Vec of dim 4), and info (passed to the apply function) Example: function myROIFunction(samplerIndex, dstRect, info) { return dstRect; } myKernel.ROIHandler = myROIFunction; STATIC VARIABLES Filter Properties: All Core Image filter under a real (e.g. CISepiaTone) or simplied name (e.g. sepiaTone) Returns a function to apply that filter. The arguments are taken in the order defined at: http://developer.apple.com/documentation/GraphicsImaging/Reference/CoreImageFilterReference Example: var sepiaImage = Filter.sepiaTone(image, 1.0); FUNCTION TO IMPLEMENT function [return_type] main([arg_type_0] arg_0, [arg_type_1] arg_1, ...) [arg_type_x] can be: __image, __vec2, __vec3, __vec4, __color, __number, __index [return_type] must be: __image Must return an image. Example of the "main" function associated to the first kernel in the kernel window and current parameters has been generated below: */ function __image main(__image image) { return gray_scott.apply(image.definition, null, image); }O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namekernel - initial U&VpositionNSValue* {CGPoint=dd}+,\QCJavaScript2)'')_~/* Scale a width and height by 2, for use as the "double-resolution bitmaps" size, but in any case always return an even number in both directions. This allows really lame graphics cards to subdivide the texture into 4 smaller work units if needed. */ function (__number out_width, __number out_height) main (__number in_width, __number in_height) { var result = new Object(); var wid_2, hei_2; wid_2 = Math.floor(in_width / 2 + 0.5); hei_2 = Math.floor(in_height / 2 + 0.5); result.out_width = 4 * wid_2; // Math.floor(in_width / 2); result.out_height = 4 * hei_2; // Math.floor(in_height / 2); return result; } O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+namenearest even double-sizepositionNSValue* {CGPoint=dd}&+,  ZQCSplitter2 )O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Image Splitter"positionNSValue* {CGPoint=dd}+,  ZQCSplitter2   )[QCIndexPort#@ ^Once per Frame\3x per Frame\8x per FrameO streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Index Splitter"positionNSValue* {CGPoint=dd}e+,  GZQCSplitter%2    )]QCBooleanPort 2 O} streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Boolean Splitter" 2 O} streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Boolean Splitter"O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Boolean Splitter"positionNSValue* {CGPoint=dd},+,  ZQCSplitter2 ) O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Number Splitter"positionNSValue* {CGPoint=dd}\QCNumberPort+,  UZQCSplitter2 !) "O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"Boolean Splitter"positionNSValue* {CGPoint=dd}]QCBooleanPort+, $ %ZQCSplitter2 &) 'O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+name"String Splitter"positionNSValue* {CGPoint=dd}\QCStringPort4 ) , / , , , 5 , 9 > @ * +_!The index of the selected source.\Source Index - ._The input port.UInput 0 1_The source color.UColor - . - . - . 6 . 7 -Tmenu - . : ; < =Tname[descriptionVEnable_ Controls execution of the patch. 6 . ? - 6 . A -^_`aС D_-com.apple.QuartzComposer.protocol.screensavero 2010 Robert Munafo_xTurns live video (or a text message of your choice) into organic patterns using the Gray-Scott reaction-diffusion model.]Xmorphia PDE5_1127 502 817 587 0 0 2048 1130 5Has}.<Ney  $&/1:@FNcoxLZiw .<KYfu+9HVdr*8FSbp~ '6DR`n|   % 3 @ N \ k y   " 0 A L ^ i {   1 < B P a l v }  / = N c j r  , = J S ^ l }  '8T]k| +8BUfs| )>OVdp)2CUfoy$5>HYfw $5F\m 1BL]fw$):DUct4=NYju~0<M^ht-6GXdo ->Odu~9JOEV[q    .,.....///1/6/A/F/L/]/f/o/x/////0!0"0*070C0d0p000000000011 111)121;1D1M1R1[1`1e1n1s1t1u1v111112"2#202=2F2T3333%3:3R3_3l3x33333333333444444445 55$565H5M5V5[5d5i5r5{5}616?6Q6^6l6u77(777A7F7K7X7e7n7y8(828?8F8[8p88888889E9R9`9}99999;HIsIIIJ*J3J<JEJJJSJXJaJrJJJJJJJJJJJJKKKKLL LLL%LLLLLMMM]MjMxMMMMMMMMMMNNN&N2N>NQNbNnNwNNNNNNNNNOOO'O?OPOaOlO}OOOOOOOPPP(P-P>PCPPPPQbQgQxQ}QRRRRSSSSTT TT T,T2TFTUTgThTmTzTTTUU"U0U=UHURV VV$V/V<VVWWW9WMWVW]WsWWWWWWWWWWWWXX XXXX$X-X2X;X>X?XBXXXXYYYZaZvZZZZZZ[[[[[[#[,[1[:[O[T[Y[^[c[h[v[[[\<\M\`\s\\\\\\\\\\\\\\\\] ]]1]F]K]T]Y]b]g]p]u]z]]]]^#^0^B^W^l^q^z^^^^^^^^^_G_T_f_{____________`k`x``aDaUababb bbb#b(b1b6b?bPbUbZb_bdbubbbbccc3cLcecjcscxcccccccccccd[didwddde/e@eEeJeMeReWeZegeref3f@fNfkhhhhhiiijCj[j_jpjuk kk,k:kWlmmmmrrrrs t4ttuuwwwwwyzzzz %-2;@INSX]fkty#1?P\m +7\e #(16?Tap}BO[|UVcqz "',9FO-2;@INW\ajotv $ 4=ISX]f%#(.,:GTao|0ALV]nx 2CT^iv,5AR[&-BGSX3D`xv6?DMR[din{n{).3WdoCPWly_lw'R_j HUc2Lr7<FKX`u$2@M[iw+9GUbp~Œš§µ&4=K\jsÁÒÝêû):CRclzċęĢijľ!*;LUfoŀŋœŤůŴ,5FO`izƃƔƝƮ-6GPalqǂNjǜǥǼN_darwʋʜʡ',˞˯˴&7<̯;LQ?lyюѫѿ(-6;<AJKN 1G[oty~ԃ.ێR_m܎ܟܵ;| "',1< -:?D4 !kpuRW\|27<Vcn 0=H]jotd %:GLQG/8Lbgl  #9Mafkpu   D Q _          +AUinsx}(LYgt+8CXamz h u      ! !!!!'Q())))))* **3*8*=*B*G133344444444444555055566666666677 77727C7L8888#8(81868?8D8M8e8r889D9P9]9h9}9999999:::::::;O;T;];;<<<<<<<<<=======>@>E>N>>??????????@p@@A7AHAMAVA[AdAiArAwAAAAABlByBBBCNC[ChCsCCCCCCCDiDvDDDDDDGFGH HH+H8H=HBHHHI@IIJJJ*J/J4JJJK4KKKLLL L%L.LLLMNMOO OO#OOOOOP*P7PEPSP`PmPzPPPPPPPPPQ QQ*Q1QIQZQeQoQvQQQQQQQQQRRR#R.R?RWRhRyRRRRRS,S=SBSSSTQTZTfTwTTUUUU W+W>WKWRWgWlWxW}X&X7XXXiXXXXXXXXXXXYYYYYZ[ZdZiZrZwZZZZZZZZZZZZ[[[[[[[\N\S\X\]|]]]]]]^8^=^B^_h_u_|_________```````a>aCaLaabwbbbbbbc2c7c@ccdmdzddfgGgTg\gqgggggggghhhhh,h=hHhMh^hlhqhhhhhhhhhhhiisiviijjk kk&kGkPk^kpkukzn&no<oIoWo`pp"p'p,p.p3p8p:pGpUpvppppprnrsssssssssuHuvvvvwZwgwtw}xxx0x<xHxMxRx[x`xixvxx|S %>zS`ky>CH~Xer}>LYdq$1^g "'3:]jq~ao I