1 Overview of Mplus

Mplus is software for structural equation modeling. A summary of the Mplus language syntax is here (archived at: https://perma.cc/962G-QUEG). The Mplus User’s Guide is located here (archived at: https://perma.cc/W39W-NRGH).

2 Prepare Data

To prepare the data in R for use in Mplus:

library("MplusAutomation")

prepareMplusData(
  mydata,
  file.path(path, "/GitHub/Project_Name/Data/mplusdata.dat"))

3 Model Example

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!  MPLUS SYNTAX LINES CANNOT EXCEED 90 CHARACTERS;
!!!!!  VARIABLE NAMES AND PARAMETER LABELS CANNOT EXCEED 8 CHARACTERS EACH;
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

TITLE: Example Mplus Model

DATA: 
    FILE = "C:/[insert_filepath]/filename.dat";

VARIABLE:
    NAMES = ID age x1 x2 x3 x4 x5 x6 y1 y2;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 x3 x4 x5 x6 y1 y2;

ANALYSIS:
    TYPE = COMPLEX;
    ESTIMATOR = MLR;

MODEL:
    ! Factor loadings
    latent1 BY x1* x2 x3;
    latent2 BY x4* x5 x6;

    ! Covariances between latent factors
    latent1 WITH latent2

    ! Regression paths
    y1 ON latent1 + latent2
    y2 ON latent1 + latent 2

    ! Standardize latent factors: fix means to zero
    [latent1@0];
    [latent2@0];

    ! Standardize latent factors: fix variances to one
    latent1@1;
    latent2@1;

OUTPUT:  
    STDYX; 
    TECH1;
    TECH4;
    SAMPSTAT;
    MODINDICES (3);
    CINTERVAL;
    RESIDUAL;

SAVEDATA:
    FILE = "C:/[insert_filepath]/filename.dat";
    SAVE = FSCORES;

4 Model Title

TITLE: INSERT TITLE HERE

5 Read Data

DATA: 
    FILE = "C:/[insert_filepath]/filename.dat";

6 Variables

6.1 Specify Variables

VARIABLE:
    NAMES = ID age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    CLUSTER = ID;

6.2 Categorical Variables

VARIABLE:
    NAMES = ID age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    CATEGORICAL = x1 x2;

6.3 Count Variables

VARIABLE:
    NAMES = ID age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    COUNT = x1 x2;

6.4 Cluster Variable

There are multiple ways of accounting for nested data in structural equation modeling. One way to account for nested data is to use multilevel structural equation modeling. Another approach is to use a cluster variable to generate cluster-robust standard errors of parameters. To use a cluster variable, specify CLUSTER under the VARIABLE section, and specify TYPE = COMPLEX under the ANALYSIS section:

VARIABLE:
    NAMES = ID age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    CLUSTER = ID;

ANALYSIS:
    TYPE = COMPLEX;

6.5 Individually Varying Times of Observation

VARIABLE:
    NAMES = ID age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    TSCORES = age;

6.6 Auxiliary Variables

VARIABLE:
    NAMES = ID age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID x1 x2 y1;
    AUXILIARY = age;

6.7 Sampling Weight Variable

VARIABLE:
    NAMES = ID wt age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    WEIGHT = wt;

6.8 Multilevel Variables

Between- and within-cluster variables:

VARIABLE:
    NAMES = ID wt age x1 x2 x3 y1;
    MISSING = .;
    USEVARIABLES = ID age x1 x2 y1;
    WITHIN = x1;
    BETWEEN = x2;

7 Analysis

7.1 Analysis Types

  • TYPE = COMPLEX
  • TYPE = TWOLEVEL
  • TYPE = EFA

7.2 Model Estimators

ANALYSIS:
    ESTIMATOR = MLR;
  • MLR: for likert/continuous data
  • WLSMV: for ordinal/categorical data
  • BAYES

7.3 Bootstrap Draws

BOOTSTRAP = 2000; ! insert number of bootstrap draws

7.4 Starts

STARTS = 20; ! insert number of initial stage starts and number of final stage optimizations

7.5 Low Covariance Coverage

To estimate a model with low covariance coverage, lower the COVERAGE value under the ANALYSIS section:

ANALYSIS:
    COVERAGE = 0;

8 Exploratory Factor Analysis

8.1 Oblique Rotation

ANALYSIS:
    TYPE = EFA 1 5; ! extract 1-5 factors
    ROTATION = GEOMIN;

8.2 Orthogonal Rotation

ANALYSIS:
    TYPE = EFA 1 5; ! extract 1-5 factors
    ROTATION = VARIMAX;

9 Bayesian SEM

Other settings you can specify under the “ANALYSIS” section include:

ANALYSIS:
    ESTIMATOR = BAYES;
    BCONVERGENCE = .05; ! value of the Gelman-Rubin convergence criterion; ! default is .05; van de Schoot et al. (2014) recommend .01
    BITERATIONS = a (b); ! a = maximum, b = minumum number of iterations for each MCMC chain
    CHAINS = 4; ! number of chains
    PROCESSORS = 4; ! number of computer processors to use
    BSEED = 52242; ! set seed for replicability
    STVALUES = ml; ! set starting values based on ML estimation

You can specify model priors under the “MODEL PRIORS” section.

Other settings you can specify under the “OUTPUT” section include:

OUTPUT:
    STAND; ! standardized estimates
    TECH1; ! model priors
    TECH8; ! potential scale reduction (PSR); to evaluate convergence (should be near one)
    CINTERVAL; ! posterior predictive intervals (credible intervals)

Other settings you can specify under the “PLOT” section include:

PLOT:
    TYPE = PLOT3; ! trace plots, histogram, and kernel density

10 Model

10.1 Define Latent Variables

MODEL:
    latent1 BY x1 x2 x3;

10.2 Regression Paths

Regress outcome variable on predictor variable(s):

MODEL:
    y1 ON x1 x2;

10.3 Covariance Paths

MODEL:
    x1 WITH x2;

10.4 Indirect Effects

ANALYSIS:
    TYPE = GENERAL;
    ESTIMATOR = ML;
    BOOTSTRAP = 1000;

MODEL:
    MODEL INDIRECT:
        y IND x;

OUTPUT:
    STAND;
    CINTERVAL (BOOTSTRAP); !percentile boostrap CI
    CINTERVAL (BCBOOTSTRAP); !bias-corrected boostrap CI

10.5 Means/Intercepts

Freely estimate:

MODEL:
    [x1];

Fix to zero:

MODEL:
    [x1@0];

10.6 Variances

Freely estimate:

MODEL:
    x1;

Fix to one:

MODEL:
    x1@1;

10.7 Parameter Label

To specify a parameter label, provide the label in parentheses after the parameter:

MODEL:
    latent1 BY x1* x2 x3 (load1-3);
    latent2 BY x4* x5 (load5) x6;

10.8 Multigroup Model

VARIABLE:
    NAMES = group x1 x2 x3 y1;
    GROUPING = group (0=boys, 1=girls);
    MISSING = .;
    USEVARIABLES = group x1 x2 x3 y1;

MODEL:
    Model boys:
        latent BY x1* x2 x3;
        [latent@0];
        latent@1;
        y ~ latent;

    Model girls:
        latent BY x1* x2 x3;
        [latent@0];
        latent@1;
        y ~ latent;

10.9 Multigroup Measurement Invariance

10.9.1 Configural Invariance

VARIABLE:
    NAMES = group x1 x2 x3 y1;
    GROUPING = group (0=boys, 1=girls);
    MISSING = .;
    USEVARIABLES = group x1 x2 x3;

MODEL:
    Model boys:
        latent BY x1* x2 x3;
        [latent@0];
        latent@1;

    Model girls:
        latent BY x1* x2 x3;
        [latent@0];
        latent@1;

10.9.2 Metric (Weak Factorial) Invariance

VARIABLE:
    NAMES = group x1 x2 x3 y1;
    GROUPING = group (0=boys, 1=girls);
    MISSING = .;
    USEVARIABLES = group x1 x2 x3;

MODEL:
    Model boys:
        latent BY x1* (load1); ! constrain factor loading across groups (same parameter label)
        latent BY x2* (load2); ! constrain factor loading across groups (same parameter label)
        latent BY x3* (load3); ! constrain factor loading across groups (same parameter label)

        [latent@0];
        latent@1;

    Model girls:
        latent BY x1* (load1); ! constrain factor loading across groups (same parameter label)
        latent BY x2* (load2); ! constrain factor loading across groups (same parameter label)
        latent BY x3* (load3); ! constrain factor loading across groups (same parameter label)

        [latent@0];
        latent@1;

10.9.3 Scalar (Strong Factorial) Invariance

VARIABLE:
    NAMES = group x1 x2 x3 y1;
    GROUPING = group (0=boys, 1=girls);
    MISSING = .;
    USEVARIABLES = group x1 x2 x3;

MODEL:
    Model boys:
        latent BY x1* (load1); ! constrain factor loading across groups (same parameter label)
        latent BY x2* (load2); ! constrain factor loading across groups (same parameter label)
        latent BY x3* (load3); ! constrain factor loading across groups (same parameter label)

        [x1] (int1); ! constrain intercept across groups (same parameter label)
        [x2] (int2); ! constrain intercept across groups (same parameter label)
        [x3] (int3); ! constrain intercept across groups (same parameter label)

        [latent@0];
        latent@1;

    Model girls:
        latent BY x1* (load1); ! constrain factor loading across groups (same parameter label)
        latent BY x2* (load2); ! constrain factor loading across groups (same parameter label)
        latent BY x3* (load3); ! constrain factor loading across groups (same parameter label)

        [x1] (int1); ! constrain intercept across groups (same parameter label)
        [x2] (int2); ! constrain intercept across groups (same parameter label)
        [x3] (int3); ! constrain intercept across groups (same parameter label)

        [latent@0];
        latent@1;

11 Comments

!This is a comment in Mplus

12 Setting Parameter Constraints

12.1 Freeing a Parameter

By default, the first loading on a factor is fixed to zero. You can freely estimate the parameter by adding an asterisk:

MODEL:
    latent1 BY x1* x2 x3;

12.2 Constraing a Parameter

MODEL:
    latent1 BY x1@1 x2 x3;
    [latent1@0];
    latent1@1;

12.3 Setting Two Parameters to be Equal

To set two parameters to be equal, provide the same parameter label for each parameter.

12.4 Setting Lower and Upper Bounds on a Parameter

To set lower and upper bounds on a parameter, you can assign the parameter a parameter label. Then, you can assign the constraint to the parameter (via the label) under the MODEL CONSTRAINT section. For example, to constrain a parameter between 0–1,

MODEL:
    latent1 BY x1* x2 x3 (load3);

MODEL CONSTRAINT:
    load3 > 0; load3 < 1;

13 Output

OUTPUT:  
    STDYX; 
    TECH1;
    TECH4;
    SAMPSTAT;
    MODINDICES (ALL); ! specify number in parentheses to print only those mod indices that are above a particular chi-square value
    CINTERVAL;
    RESIDUAL;

14 Save Factor Scores

SAVEDATA:
    FILE = "C:/[insert_filepath]/filename.dat";
    SAVE = FSCORES;

15 Multiple Imputation

For examples of how to conduct multiple imputation in Mplus, see here. To run a model on multiply imputed data, use the following:

DATA: FILE = "implist.dat"; ! where implist.dat is the name of the *list.dat file saved from the imputation step
    TYPE = IMPUTATION;

16 Run Models in Batch

Run models in batch via R:

library("MplusAutomation")

runModels(
  file.path(path, "/GitHub/Project_Name/Analyses/Mplus/"),
  recursive = TRUE,
  replaceOutfile = "always",
  showOutput = TRUE)

17 Monte Carlo Simulation/Power Analysis

17.1 Single Group Model

TITLE: Single-Group Monte Carlo Simulation with Ordinal Items and Common Factor;

MONTECARLO:
    NAMES = v1-v5; ! variable names
    NOBSERVATIONS = 500; ! number of participants in each sample
    NREPS = 100000; ! number of samples to create
    SEED = 52242; ! random seed
    GENERATE = v1-v5 (3 p); ! specify the scale of the DVs; number of thresholds; probit (p)
    CATEGORICAL = v1-v5; ! specify the variables that are (ordered) categorical

ANALYSIS:
    PROCESSORS = 4 1; ! number of processors; number of threads
    ESTIMATOR = WLSMV;
    PARAMETERIZATION = THETA;

MODEL POPULATION: ! tell Mplus how to generate the population data; can use asterisks (*) and at symbols (@) interchangeably here, but they differ in the MODEL command (see below); I use the same symbol as in the MODEL command
    dep BY v1-v5*.7; ! factor loadings
    [dep@0]; ! set factor mean to 0
    dep@1; ! set factor variance to 1 (standardize)
    [v1$1*0.5] (v1t1); [v1$2*1.0] (v1t2); [v1$3*1.5] (v1t3); ! item thresholds for v1
    [v2$1*0.5] (v2t1); [v2$2*1.0] (v2t2); [v2$3*1.5] (v2t3); ! item thresholds for v2
    [v3$1*0.5] (v3t1); [v3$2*1.0] (v3t2); [v3$3*1.5] (v3t3); ! item thresholds for v3
    [v4$1*0.0] (v4t1); [v4$2*0.5] (v4t2); [v4$3*1.0] (v4t3); ! item thresholds for v4
    [v5$1*0.0] (v5t1); [v5$2*0.5] (v5t2); [v5$3*1.0] (v5t3); ! item thresholds for v5
    v1-v5@1; ! item residual variances

MODEL: ! tell Mplus to estimate our model; asterisks (*) are free estimates with a starting value; at symbols (@) are fixed estimates
    dep BY v1-v5*.7; ! factor loadings
    [dep@0]; ! set factor mean to 0
    dep@1; ! set factor variance to 1 (standardize)
    [v1$1*0.5] (v1t1); [v1$2*1.0] (v1t2); [v1$3*1.5] (v1t3); ! item thresholds for v1
    [v2$1*0.5] (v2t1); [v2$2*1.0] (v2t2); [v2$3*1.5] (v2t3); ! item thresholds for v2
    [v3$1*0.5] (v3t1); [v3$2*1.0] (v3t2); [v3$3*1.5] (v3t3); ! item thresholds for v3
    [v4$1*0.0] (v4t1); [v4$2*0.5] (v4t2); [v4$3*1.0] (v4t3); ! item thresholds for v4
    [v5$1*0.0] (v5t1); [v5$2*0.5] (v5t2); [v5$3*1.0] (v5t3); ! item thresholds for v5
    v1-v5@1; ! item residual variances

MODEL CONSTRAINT:
    NEW (stdt stdt1 stdt2 stdt3 noninvt noninvt1 noninvt2 noninvt3 diff);
    
    stdt1 = (v1t1 + v2t1 + v3t1) / 3;
    stdt2 = (v1t2 + v2t2 + v3t2) / 3;
    stdt3 = (v1t3 + v2t3 + v3t3) / 3;
    
    noninvt1 = (v4t1 + v5t1) / 2;
    noninvt2 = (v4t2 + v5t2) / 2;
    noninvt3 = (v4t3 + v5t3) / 2;
    
    stdt = (stdt1 + stdt2 + stdt3) / 3;
    noninvt = (noninvt1 + noninvt2 + noninvt3) / 3;
    
    diff = noninvt - stdt;

OUTPUT:
    TECH9;

17.2 Multi-Group Model

TITLE: Multi-Group Monte Carlo Simulation with Ordinal Items and Common Factor;

MONTECARLO:
    NAMES = v1-v5; ! variable names
    NGROUPS = 2; ! number of groups
    NOBSERVATIONS = 500 300; ! number of participants in each sample
    NREPS = 100000; ! number of samples to create
    SEED = 52242; ! random seed
    GENERATE = v1-v5 (3 p); ! specify the scale of the DVs; number of thresholds; probit (p)
    CATEGORICAL = v1-v5; ! specify the variables that are (ordered) categorical

ANALYSIS:
    PROCESSORS = 4 1; ! number of processors; number of threads
    ESTIMATOR = WLSMV;
    PARAMETERIZATION = THETA;

MODEL POPULATION: ! tell Mplus how to generate the population data; can use asterisks (*) and at symbols (@) interchangeably here, but they differ in the MODEL command (see below); I use the same symbol as in the MODEL command
    dep BY v1-v5*.7; ! factor loadings
    [dep@0]; ! set factor mean to 0
    dep@1; ! set factor variance to 1 (standardize)
    [v1$1*0.5] (v1t1g1); [v1$2*1.0] (v1t2g1); [v1$3*1.5] (v1t3g1); ! item thresholds for v1
    [v2$1*0.5] (v2t1g1); [v2$2*1.0] (v2t2g1); [v2$3*1.5] (v2t3g1); ! item thresholds for v2
    [v3$1*0.5] (v3t1g1); [v3$2*1.0] (v3t2g1); [v3$3*1.5] (v3t3g1); ! item thresholds for v3
    [v4$1*0.5] (v4t1g1); [v4$2*1.0] (v4t2g1); [v4$3*1.5] (v4t3g1); ! item thresholds for v4
    [v5$1*0.5] (v5t1g1); [v5$2*1.0] (v5t2g1); [v5$3*1.5] (v5t3g1); ! item thresholds for v5
    v1-v5@1; ! item residual variances
    
MODEL POPULATION-g2: ! tell Mplus how to generate the population data for group 2; can use asterisks (*) and at symbols (@) interchangeably here, but they differ in the MODEL command (see below); I use the same symbol as in the MODEL command
    !dep BY v1-v5*.7; ! factor loadings
    ![dep@0]; ! set factor mean to 0
    !dep@1; ! set factor variance to 1 (standardize)
    [v1$1*0.5] (v1t1g2); [v1$2*1.0] (v1t2g2); [v1$3*1.5] (v1t3g2); ! item thresholds for v1
    [v2$1*0.5] (v2t1g2); [v2$2*1.0] (v2t2g2); [v2$3*1.5] (v2t3g2); ! item thresholds for v2
    [v3$1*0.5] (v3t1g2); [v3$2*1.0] (v3t2g2); [v3$3*1.5] (v3t3g2); ! item thresholds for v3
    [v4$1*0.0] (v4t1g2); [v4$2*0.5] (v4t2g2); [v4$3*1.0] (v4t3g2); ! item thresholds for v4
    [v5$1*0.0] (v5t1g2); [v5$2*0.5] (v5t2g2); [v5$3*1.0] (v5t3g2); ! item thresholds for v5
    !v1-v5@1; ! item residual variances

MODEL: ! tell Mplus to estimate our model; asterisks (*) are free estimates with a starting value; at symbols (@) are fixed estimates
    dep BY v1-v5*.7; ! factor loadings
    [dep@0]; ! set factor mean to 0
    dep@1; ! set factor variance to 1 (standardize)
    [v1$1*0.5] (v1t1g1); [v1$2*1.0] (v1t2g1); [v1$3*1.5] (v1t3g1); ! item thresholds for v1
    [v2$1*0.5] (v2t1g1); [v2$2*1.0] (v2t2g1); [v2$3*1.5] (v2t3g1); ! item thresholds for v2
    [v3$1*0.5] (v3t1g1); [v3$2*1.0] (v3t2g1); [v3$3*1.5] (v3t3g1); ! item thresholds for v3
    [v4$1*0.5] (v4t1g1); [v4$2*1.0] (v4t2g1); [v4$3*1.5] (v4t3g1); ! item thresholds for v4
    [v5$1*0.5] (v5t1g1); [v5$2*1.0] (v5t2g1); [v5$3*1.5] (v5t3g1); ! item thresholds for v5
    v1-v5@1; ! item residual variances
   
MODEL g2: ! tell Mplus to estimate our model in group 2; asterisks (*) are free estimates with a starting value; at symbols (@) are fixed estimates
    !dep BY v1-v5*.7; ! factor loadings
    ![dep@0]; ! set factor mean to 0
    !dep@1; ! set factor variance to 1 (standardize)
    [v1$1*0.5] (v1t1g2); [v1$2*1.0] (v1t2g2); [v1$3*1.5] (v1t3g2); ! item thresholds for v1
    [v2$1*0.5] (v2t1g2); [v2$2*1.0] (v2t2g2); [v2$3*1.5] (v2t3g2); ! item thresholds for v2
    [v3$1*0.5] (v3t1g2); [v3$2*1.0] (v3t2g2); [v3$3*1.5] (v3t3g2); ! item thresholds for v3
    [v4$1*0.0] (v4t1g2); [v4$2*0.5] (v4t2g2); [v4$3*1.0] (v4t3g2); ! item thresholds for v4
    [v5$1*0.0] (v5t1g2); [v5$2*0.5] (v5t2g2); [v5$3*1.0] (v5t3g2); ! item thresholds for v5
    !v1-v5@1; ! item residual variances

MODEL CONSTRAINT:
    NEW (stdt1g1 stdt2g1 stdt3g1 stdt1g2 stdt2g2 stdt3g2
    nonit1g1 nonit2g1 nonit3g1 nonit1g2 nonit2g2 nonit3g2
    stdtg1 stdtg2 nonitg1 nonitg2 diffwg diffbg);
    
    stdt1g1 = (v1t1g1 + v2t1g1 + v3t1g1) / 3;
    stdt2g1 = (v1t2g1 + v2t2g1 + v3t2g1) / 3;
    stdt3g1 = (v1t3g1 + v2t3g1 + v3t3g1) / 3;
    
    stdt1g2 = (v1t1g2 + v2t1g2 + v3t1g2) / 3;
    stdt2g2 = (v1t2g2 + v2t2g2 + v3t2g2) / 3;
    stdt3g2 = (v1t3g2 + v2t3g2 + v3t3g2) / 3;
    
    nonit1g1 = (v4t1g1 + v5t1g1) / 2;
    nonit2g1 = (v4t2g1 + v5t2g1) / 2;
    nonit3g1 = (v4t3g1 + v5t3g1) / 2;
    
    nonit1g2 = (v4t1g2 + v5t1g2) / 2;
    nonit2g2 = (v4t2g2 + v5t2g2) / 2;
    nonit3g2 = (v4t3g2 + v5t3g2) / 2;
    
    stdtg1 = (stdt1g1 + stdt2g1 + stdt3g1) / 3;
    stdtg2 = (stdt1g2 + stdt2g2 + stdt3g2) / 3;
    
    nonitg1 = (nonit1g1 + nonit2g1 + nonit3g1) / 3;
    nonitg2 = (nonit1g2 + nonit2g2 + nonit3g2) / 3;
    
    diffwg = nonitg2 - stdtg2; ! difference within group
    
    diffbg = nonitg2 - nonitg1; ! difference between groups
    
OUTPUT:
    TECH9;

18 Session Info

sessionInfo()
R version 4.4.2 (2024-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.5 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
[10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

time zone: UTC
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] digest_0.6.37     R6_2.5.1          fastmap_1.2.0     xfun_0.49        
 [5] cachem_1.1.0      knitr_1.49        htmltools_0.5.8.1 rmarkdown_2.29   
 [9] lifecycle_1.0.4   cli_3.6.3         sass_0.4.9        jquerylib_0.1.4  
[13] compiler_4.4.2    tools_4.4.2       evaluate_1.0.1    bslib_0.8.0      
[17] yaml_2.3.10       rlang_1.1.4       jsonlite_1.8.9   
LS0tCnRpdGxlOiAiTXBsdXMiCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLAogIGVycm9yID0gVFJVRSwKICBjb21tZW50ID0gIiIsCiAgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIpCmBgYAoKIyBPdmVydmlldyBvZiBgTXBsdXNgCgpbYE1wbHVzYF0oaHR0cHM6Ly93d3cuc3RhdG1vZGVsLmNvbSkgaXMgc29mdHdhcmUgZm9yIFtzdHJ1Y3R1cmFsIGVxdWF0aW9uIG1vZGVsaW5nXShzZW0uaHRtbCkuCkEgc3VtbWFyeSBvZiB0aGUgW2BNcGx1c2BdKGh0dHBzOi8vd3d3LnN0YXRtb2RlbC5jb20pIGxhbmd1YWdlIHN5bnRheCBpcyBbaGVyZV0oaHR0cHM6Ly93d3cuc3RhdG1vZGVsLmNvbS9sYW5ndWFnZS5odG1sKSAoYXJjaGl2ZWQgYXQ6IGh0dHBzOi8vcGVybWEuY2MvOTYyRy1RVUVHKS4KVGhlIFtNcGx1cyBVc2VyJ3MgR3VpZGVdKGh0dHBzOi8vd3d3LnN0YXRtb2RlbC5jb20vaHRtbF91Zy5zaHRtbCkgaXMgbG9jYXRlZCBbaGVyZV0oaHR0cHM6Ly93d3cuc3RhdG1vZGVsLmNvbS9kb3dubG9hZC91c2Vyc2d1aWRlL01wbHVzVXNlckd1aWRlVmVyXzgucGRmKSAoYXJjaGl2ZWQgYXQ6IGh0dHBzOi8vcGVybWEuY2MvVzM5Vy1OUkdIKS4KCiMgUHJlcGFyZSBEYXRhIHsjcHJlcGFyZURhdGF9CgpUbyBwcmVwYXJlIHRoZSBkYXRhIGluIGBSYCBmb3IgdXNlIGluIGBNcGx1c2A6CgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpsaWJyYXJ5KCJNcGx1c0F1dG9tYXRpb24iKQoKcHJlcGFyZU1wbHVzRGF0YSgKICBteWRhdGEsCiAgZmlsZS5wYXRoKHBhdGgsICIvR2l0SHViL1Byb2plY3RfTmFtZS9EYXRhL21wbHVzZGF0YS5kYXQiKSkKYGBgCgojIE1vZGVsIEV4YW1wbGUgeyNleGFtcGxlfQoKYGBgCiEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKISEhISEgIE1QTFVTIFNZTlRBWCBMSU5FUyBDQU5OT1QgRVhDRUVEIDkwIENIQVJBQ1RFUlM7CiEhISEhICBWQVJJQUJMRSBOQU1FUyBBTkQgUEFSQU1FVEVSIExBQkVMUyBDQU5OT1QgRVhDRUVEIDggQ0hBUkFDVEVSUyBFQUNIOwohISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCgpUSVRMRTogRXhhbXBsZSBNcGx1cyBNb2RlbAoKREFUQTogCiAgICBGSUxFID0gIkM6L1tpbnNlcnRfZmlsZXBhdGhdL2ZpbGVuYW1lLmRhdCI7CgpWQVJJQUJMRToKICAgIE5BTUVTID0gSUQgYWdlIHgxIHgyIHgzIHg0IHg1IHg2IHkxIHkyOwogICAgTUlTU0lORyA9IC47CiAgICBVU0VWQVJJQUJMRVMgPSBJRCBhZ2UgeDEgeDIgeDMgeDQgeDUgeDYgeTEgeTI7CgpBTkFMWVNJUzoKICAgIFRZUEUgPSBDT01QTEVYOwogICAgRVNUSU1BVE9SID0gTUxSOwoKTU9ERUw6CiAgICAhIEZhY3RvciBsb2FkaW5ncwogICAgbGF0ZW50MSBCWSB4MSogeDIgeDM7CiAgICBsYXRlbnQyIEJZIHg0KiB4NSB4NjsKCiAgICAhIENvdmFyaWFuY2VzIGJldHdlZW4gbGF0ZW50IGZhY3RvcnMKICAgIGxhdGVudDEgV0lUSCBsYXRlbnQyCgogICAgISBSZWdyZXNzaW9uIHBhdGhzCiAgICB5MSBPTiBsYXRlbnQxICsgbGF0ZW50MgogICAgeTIgT04gbGF0ZW50MSArIGxhdGVudCAyCgogICAgISBTdGFuZGFyZGl6ZSBsYXRlbnQgZmFjdG9yczogZml4IG1lYW5zIHRvIHplcm8KICAgIFtsYXRlbnQxQDBdOwogICAgW2xhdGVudDJAMF07CgogICAgISBTdGFuZGFyZGl6ZSBsYXRlbnQgZmFjdG9yczogZml4IHZhcmlhbmNlcyB0byBvbmUKICAgIGxhdGVudDFAMTsKICAgIGxhdGVudDJAMTsKCk9VVFBVVDogIAogICAgU1REWVg7IAogICAgVEVDSDE7CiAgICBURUNINDsKICAgIFNBTVBTVEFUOwogICAgTU9ESU5ESUNFUyAoMyk7CiAgICBDSU5URVJWQUw7CiAgICBSRVNJRFVBTDsKClNBVkVEQVRBOgogICAgRklMRSA9ICJDOi9baW5zZXJ0X2ZpbGVwYXRoXS9maWxlbmFtZS5kYXQiOwogICAgU0FWRSA9IEZTQ09SRVM7CmBgYAoKIyBNb2RlbCBUaXRsZSB7I21vZGVsVGl0bGV9CgpgYGAKVElUTEU6IElOU0VSVCBUSVRMRSBIRVJFCmBgYAoKIyBSZWFkIERhdGEgeyNyZWFkRGF0YX0KCmBgYApEQVRBOiAKICAgIEZJTEUgPSAiQzovW2luc2VydF9maWxlcGF0aF0vZmlsZW5hbWUuZGF0IjsKYGBgCgojIFZhcmlhYmxlcyB7I3ZhcmlhYmxlc30KCiMjIFNwZWNpZnkgVmFyaWFibGVzIHsjc3BlY2lmeVZhcmlhYmxlc30KCmBgYApWQVJJQUJMRToKICAgIE5BTUVTID0gSUQgYWdlIHgxIHgyIHgzIHkxOwogICAgTUlTU0lORyA9IC47CiAgICBVU0VWQVJJQUJMRVMgPSBJRCBhZ2UgeDEgeDIgeTE7CiAgICBDTFVTVEVSID0gSUQ7CmBgYAoKIyMgQ2F0ZWdvcmljYWwgVmFyaWFibGVzIHsjY2F0ZWdvcmljYWxWYXJpYWJsZXN9CgpgYGAKVkFSSUFCTEU6CiAgICBOQU1FUyA9IElEIGFnZSB4MSB4MiB4MyB5MTsKICAgIE1JU1NJTkcgPSAuOwogICAgVVNFVkFSSUFCTEVTID0gSUQgYWdlIHgxIHgyIHkxOwogICAgQ0FURUdPUklDQUwgPSB4MSB4MjsKYGBgCgojIyBDb3VudCBWYXJpYWJsZXMgeyNjb3VudFZhcmlhYmxlc30KCmBgYApWQVJJQUJMRToKICAgIE5BTUVTID0gSUQgYWdlIHgxIHgyIHgzIHkxOwogICAgTUlTU0lORyA9IC47CiAgICBVU0VWQVJJQUJMRVMgPSBJRCBhZ2UgeDEgeDIgeTE7CiAgICBDT1VOVCA9IHgxIHgyOwpgYGAKCiMjIENsdXN0ZXIgVmFyaWFibGUgeyNjbHVzdGVyVmFyaWFibGV9CgpUaGVyZSBhcmUgbXVsdGlwbGUgd2F5cyBvZiBhY2NvdW50aW5nIGZvciBuZXN0ZWQgZGF0YSBpbiBbc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbGluZ10oc2VtLmh0bWwpLgpPbmUgd2F5IHRvIGFjY291bnQgZm9yIG5lc3RlZCBkYXRhIGlzIHRvIHVzZSBtdWx0aWxldmVsIHN0cnVjdHVyYWwgZXF1YXRpb24gbW9kZWxpbmcuCkFub3RoZXIgYXBwcm9hY2ggaXMgdG8gdXNlIGEgY2x1c3RlciB2YXJpYWJsZSB0byBnZW5lcmF0ZSBjbHVzdGVyLXJvYnVzdCBzdGFuZGFyZCBlcnJvcnMgb2YgcGFyYW1ldGVycy4KVG8gdXNlIGEgY2x1c3RlciB2YXJpYWJsZSwgc3BlY2lmeSBgQ0xVU1RFUmAgdW5kZXIgdGhlIGBWQVJJQUJMRWAgc2VjdGlvbiwgYW5kIHNwZWNpZnkgYFRZUEUgPSBDT01QTEVYYCB1bmRlciB0aGUgYEFOQUxZU0lTYCBzZWN0aW9uOgoKYGBgClZBUklBQkxFOgogICAgTkFNRVMgPSBJRCBhZ2UgeDEgeDIgeDMgeTE7CiAgICBNSVNTSU5HID0gLjsKICAgIFVTRVZBUklBQkxFUyA9IElEIGFnZSB4MSB4MiB5MTsKICAgIENMVVNURVIgPSBJRDsKCkFOQUxZU0lTOgogICAgVFlQRSA9IENPTVBMRVg7CmBgYAoKIyMgSW5kaXZpZHVhbGx5IFZhcnlpbmcgVGltZXMgb2YgT2JzZXJ2YXRpb24geyN0U2NvcmVzfQoKYGBgClZBUklBQkxFOgogICAgTkFNRVMgPSBJRCBhZ2UgeDEgeDIgeDMgeTE7CiAgICBNSVNTSU5HID0gLjsKICAgIFVTRVZBUklBQkxFUyA9IElEIGFnZSB4MSB4MiB5MTsKICAgIFRTQ09SRVMgPSBhZ2U7CmBgYAoKIyMgQXV4aWxpYXJ5IFZhcmlhYmxlcyB7I2F1eGlsaWFyeVZhcmlhYmxlc30KCmBgYApWQVJJQUJMRToKICAgIE5BTUVTID0gSUQgYWdlIHgxIHgyIHgzIHkxOwogICAgTUlTU0lORyA9IC47CiAgICBVU0VWQVJJQUJMRVMgPSBJRCB4MSB4MiB5MTsKICAgIEFVWElMSUFSWSA9IGFnZTsKYGBgCgojIyBTYW1wbGluZyBXZWlnaHQgVmFyaWFibGUgeyNzYW1wbGluZ1dlaWdodH0KCmBgYApWQVJJQUJMRToKICAgIE5BTUVTID0gSUQgd3QgYWdlIHgxIHgyIHgzIHkxOwogICAgTUlTU0lORyA9IC47CiAgICBVU0VWQVJJQUJMRVMgPSBJRCBhZ2UgeDEgeDIgeTE7CiAgICBXRUlHSFQgPSB3dDsKYGBgCgojIyBNdWx0aWxldmVsIFZhcmlhYmxlcyB7I211bHRpbGV2ZWxWYXJpYWJsZXN9CgpCZXR3ZWVuLSBhbmQgd2l0aGluLWNsdXN0ZXIgdmFyaWFibGVzOgoKYGBgClZBUklBQkxFOgogICAgTkFNRVMgPSBJRCB3dCBhZ2UgeDEgeDIgeDMgeTE7CiAgICBNSVNTSU5HID0gLjsKICAgIFVTRVZBUklBQkxFUyA9IElEIGFnZSB4MSB4MiB5MTsKICAgIFdJVEhJTiA9IHgxOwogICAgQkVUV0VFTiA9IHgyOwpgYGAKCiMgQW5hbHlzaXMgeyNhbmFseXNpc30KCiMjIEFuYWx5c2lzIFR5cGVzIHsjYW5hbHlzaXNUeXBlc30KCi0gYFRZUEUgPSBDT01QTEVYYAotIGBUWVBFID0gVFdPTEVWRUxgCi0gYFRZUEUgPSBFRkFgCgojIyBNb2RlbCBFc3RpbWF0b3JzIHsjZXN0aW1hdG9yc30KCmBgYApBTkFMWVNJUzoKICAgIEVTVElNQVRPUiA9IE1MUjsKYGBgCgotIGBNTFJgOiBmb3IgbGlrZXJ0L2NvbnRpbnVvdXMgZGF0YQotIGBXTFNNVmA6IGZvciBvcmRpbmFsL2NhdGVnb3JpY2FsIGRhdGEKLSBgQkFZRVNgCgojIyBCb290c3RyYXAgRHJhd3MgeyNib290c3RyYXB9CgpgYGAKQk9PVFNUUkFQID0gMjAwMDsgISBpbnNlcnQgbnVtYmVyIG9mIGJvb3RzdHJhcCBkcmF3cwpgYGAKCiMjIFN0YXJ0cyB7I3N0YXJ0c30KCmBgYApTVEFSVFMgPSAyMDsgISBpbnNlcnQgbnVtYmVyIG9mIGluaXRpYWwgc3RhZ2Ugc3RhcnRzIGFuZCBudW1iZXIgb2YgZmluYWwgc3RhZ2Ugb3B0aW1pemF0aW9ucwpgYGAKCiMjIExvdyBDb3ZhcmlhbmNlIENvdmVyYWdlIHsjbG93Q292YXJpYW5jZUNvdmVyYWdlfQoKVG8gZXN0aW1hdGUgYSBtb2RlbCB3aXRoIGxvdyBjb3ZhcmlhbmNlIGNvdmVyYWdlLCBsb3dlciB0aGUgYENPVkVSQUdFYCB2YWx1ZSB1bmRlciB0aGUgYEFOQUxZU0lTYCBzZWN0aW9uOgoKYGBgCkFOQUxZU0lTOgogICAgQ09WRVJBR0UgPSAwOwpgYGAKCiMgRXhwbG9yYXRvcnkgRmFjdG9yIEFuYWx5c2lzIHsjZWZhfQoKIyMgT2JsaXF1ZSBSb3RhdGlvbiB7I29ibGlxdWV9CgpgYGAKQU5BTFlTSVM6CiAgICBUWVBFID0gRUZBIDEgNTsgISBleHRyYWN0IDEtNSBmYWN0b3JzCiAgICBST1RBVElPTiA9IEdFT01JTjsKYGBgCgojIyBPcnRob2dvbmFsIFJvdGF0aW9uIHsjb3J0aG9nb25hbH0KCmBgYApBTkFMWVNJUzoKICAgIFRZUEUgPSBFRkEgMSA1OyAhIGV4dHJhY3QgMS01IGZhY3RvcnMKICAgIFJPVEFUSU9OID0gVkFSSU1BWDsKYGBgCgojIEJheWVzaWFuIFNFTSB7I2JheWVzaWFufQoKT3RoZXIgc2V0dGluZ3MgeW91IGNhbiBzcGVjaWZ5IHVuZGVyIHRoZSAiQU5BTFlTSVMiIHNlY3Rpb24gaW5jbHVkZToKCmBgYApBTkFMWVNJUzoKICAgIEVTVElNQVRPUiA9IEJBWUVTOwogICAgQkNPTlZFUkdFTkNFID0gLjA1OyAhIHZhbHVlIG9mIHRoZSBHZWxtYW4tUnViaW4gY29udmVyZ2VuY2UgY3JpdGVyaW9uOyAhIGRlZmF1bHQgaXMgLjA1OyB2YW4gZGUgU2Nob290IGV0IGFsLiAoMjAxNCkgcmVjb21tZW5kIC4wMQogICAgQklURVJBVElPTlMgPSBhIChiKTsgISBhID0gbWF4aW11bSwgYiA9IG1pbnVtdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGVhY2ggTUNNQyBjaGFpbgogICAgQ0hBSU5TID0gNDsgISBudW1iZXIgb2YgY2hhaW5zCiAgICBQUk9DRVNTT1JTID0gNDsgISBudW1iZXIgb2YgY29tcHV0ZXIgcHJvY2Vzc29ycyB0byB1c2UKICAgIEJTRUVEID0gNTIyNDI7ICEgc2V0IHNlZWQgZm9yIHJlcGxpY2FiaWxpdHkKICAgIFNUVkFMVUVTID0gbWw7ICEgc2V0IHN0YXJ0aW5nIHZhbHVlcyBiYXNlZCBvbiBNTCBlc3RpbWF0aW9uCmBgYAoKWW91IGNhbiBzcGVjaWZ5IG1vZGVsIHByaW9ycyB1bmRlciB0aGUgIk1PREVMIFBSSU9SUyIgc2VjdGlvbi4KCk90aGVyIHNldHRpbmdzIHlvdSBjYW4gc3BlY2lmeSB1bmRlciB0aGUgIk9VVFBVVCIgc2VjdGlvbiBpbmNsdWRlOgoKYGBgCk9VVFBVVDoKICAgIFNUQU5EOyAhIHN0YW5kYXJkaXplZCBlc3RpbWF0ZXMKICAgIFRFQ0gxOyAhIG1vZGVsIHByaW9ycwogICAgVEVDSDg7ICEgcG90ZW50aWFsIHNjYWxlIHJlZHVjdGlvbiAoUFNSKTsgdG8gZXZhbHVhdGUgY29udmVyZ2VuY2UgKHNob3VsZCBiZSBuZWFyIG9uZSkKICAgIENJTlRFUlZBTDsgISBwb3N0ZXJpb3IgcHJlZGljdGl2ZSBpbnRlcnZhbHMgKGNyZWRpYmxlIGludGVydmFscykKYGBgCgpPdGhlciBzZXR0aW5ncyB5b3UgY2FuIHNwZWNpZnkgdW5kZXIgdGhlICJQTE9UIiBzZWN0aW9uIGluY2x1ZGU6CgpgYGAKUExPVDoKICAgIFRZUEUgPSBQTE9UMzsgISB0cmFjZSBwbG90cywgaGlzdG9ncmFtLCBhbmQga2VybmVsIGRlbnNpdHkKYGBgCgojIE1vZGVsIHsjbW9kZWx9CgojIyBEZWZpbmUgTGF0ZW50IFZhcmlhYmxlcyB7I2xhdGVudFZhcmlhYmxlc30KCmBgYApNT0RFTDoKICAgIGxhdGVudDEgQlkgeDEgeDIgeDM7CmBgYAoKIyMgUmVncmVzc2lvbiBQYXRocyB7I3JlZ3Jlc3Npb25QYXRoc30KClJlZ3Jlc3Mgb3V0Y29tZSB2YXJpYWJsZSBvbiBwcmVkaWN0b3IgdmFyaWFibGUocyk6CgpgYGAKTU9ERUw6CiAgICB5MSBPTiB4MSB4MjsKYGBgCgojIyBDb3ZhcmlhbmNlIFBhdGhzIHsjY292YXJpYW5jZVBhdGhzfQoKYGBgCk1PREVMOgogICAgeDEgV0lUSCB4MjsKYGBgCgojIyBJbmRpcmVjdCBFZmZlY3RzIHsjaW5kaXJlY3RFZmZlY3RzfQoKYGBgCkFOQUxZU0lTOgogICAgVFlQRSA9IEdFTkVSQUw7CiAgICBFU1RJTUFUT1IgPSBNTDsKICAgIEJPT1RTVFJBUCA9IDEwMDA7CgpNT0RFTDoKICAgIE1PREVMIElORElSRUNUOgogICAgICAgIHkgSU5EIHg7CgpPVVRQVVQ6CiAgICBTVEFORDsKICAgIENJTlRFUlZBTCAoQk9PVFNUUkFQKTsgIXBlcmNlbnRpbGUgYm9vc3RyYXAgQ0kKICAgIENJTlRFUlZBTCAoQkNCT09UU1RSQVApOyAhYmlhcy1jb3JyZWN0ZWQgYm9vc3RyYXAgQ0kKYGBgCgojIyBNZWFucy9JbnRlcmNlcHRzIHsjbWVhbnN9CgpGcmVlbHkgZXN0aW1hdGU6CgpgYGAKTU9ERUw6CiAgICBbeDFdOwpgYGAKCkZpeCB0byB6ZXJvOgoKYGBgCk1PREVMOgogICAgW3gxQDBdOwpgYGAKCiMjIFZhcmlhbmNlcyB7I3ZhcmlhbmNlc30KCkZyZWVseSBlc3RpbWF0ZToKCmBgYApNT0RFTDoKICAgIHgxOwpgYGAKCkZpeCB0byBvbmU6CgpgYGAKTU9ERUw6CiAgICB4MUAxOwpgYGAKCiMjIFBhcmFtZXRlciBMYWJlbCB7I3BhcmFtZXRlckxhYmVsfQoKVG8gc3BlY2lmeSBhIHBhcmFtZXRlciBsYWJlbCwgcHJvdmlkZSB0aGUgbGFiZWwgaW4gcGFyZW50aGVzZXMgYWZ0ZXIgdGhlIHBhcmFtZXRlcjoKCmBgYApNT0RFTDoKICAgIGxhdGVudDEgQlkgeDEqIHgyIHgzIChsb2FkMS0zKTsKICAgIGxhdGVudDIgQlkgeDQqIHg1IChsb2FkNSkgeDY7CmBgYAoKIyMgTXVsdGlncm91cCBNb2RlbCB7I211bHRpZ3JvdXB9CgpgYGAKVkFSSUFCTEU6CiAgICBOQU1FUyA9IGdyb3VwIHgxIHgyIHgzIHkxOwogICAgR1JPVVBJTkcgPSBncm91cCAoMD1ib3lzLCAxPWdpcmxzKTsKICAgIE1JU1NJTkcgPSAuOwogICAgVVNFVkFSSUFCTEVTID0gZ3JvdXAgeDEgeDIgeDMgeTE7CgpNT0RFTDoKICAgIE1vZGVsIGJveXM6CiAgICAgICAgbGF0ZW50IEJZIHgxKiB4MiB4MzsKICAgICAgICBbbGF0ZW50QDBdOwogICAgICAgIGxhdGVudEAxOwogICAgICAgIHkgfiBsYXRlbnQ7CgogICAgTW9kZWwgZ2lybHM6CiAgICAgICAgbGF0ZW50IEJZIHgxKiB4MiB4MzsKICAgICAgICBbbGF0ZW50QDBdOwogICAgICAgIGxhdGVudEAxOwogICAgICAgIHkgfiBsYXRlbnQ7CmBgYAoKIyMgTXVsdGlncm91cCBNZWFzdXJlbWVudCBJbnZhcmlhbmNlIHsjbWVhc3VyZW1lbnRJbnZhcmlhbmNlfQoKIyMjIENvbmZpZ3VyYWwgSW52YXJpYW5jZSB7I2NvbmZpZ3VyYWxJbnZhcmlhbmNlfQoKYGBgClZBUklBQkxFOgogICAgTkFNRVMgPSBncm91cCB4MSB4MiB4MyB5MTsKICAgIEdST1VQSU5HID0gZ3JvdXAgKDA9Ym95cywgMT1naXJscyk7CiAgICBNSVNTSU5HID0gLjsKICAgIFVTRVZBUklBQkxFUyA9IGdyb3VwIHgxIHgyIHgzOwoKTU9ERUw6CiAgICBNb2RlbCBib3lzOgogICAgICAgIGxhdGVudCBCWSB4MSogeDIgeDM7CiAgICAgICAgW2xhdGVudEAwXTsKICAgICAgICBsYXRlbnRAMTsKCiAgICBNb2RlbCBnaXJsczoKICAgICAgICBsYXRlbnQgQlkgeDEqIHgyIHgzOwogICAgICAgIFtsYXRlbnRAMF07CiAgICAgICAgbGF0ZW50QDE7CmBgYAoKIyMjIE1ldHJpYyAoV2VhayBGYWN0b3JpYWwpIEludmFyaWFuY2UgeyNtZXRyaWNJbnZhcmlhbmNlfQoKYGBgClZBUklBQkxFOgogICAgTkFNRVMgPSBncm91cCB4MSB4MiB4MyB5MTsKICAgIEdST1VQSU5HID0gZ3JvdXAgKDA9Ym95cywgMT1naXJscyk7CiAgICBNSVNTSU5HID0gLjsKICAgIFVTRVZBUklBQkxFUyA9IGdyb3VwIHgxIHgyIHgzOwoKTU9ERUw6CiAgICBNb2RlbCBib3lzOgogICAgICAgIGxhdGVudCBCWSB4MSogKGxvYWQxKTsgISBjb25zdHJhaW4gZmFjdG9yIGxvYWRpbmcgYWNyb3NzIGdyb3VwcyAoc2FtZSBwYXJhbWV0ZXIgbGFiZWwpCiAgICAgICAgbGF0ZW50IEJZIHgyKiAobG9hZDIpOyAhIGNvbnN0cmFpbiBmYWN0b3IgbG9hZGluZyBhY3Jvc3MgZ3JvdXBzIChzYW1lIHBhcmFtZXRlciBsYWJlbCkKICAgICAgICBsYXRlbnQgQlkgeDMqIChsb2FkMyk7ICEgY29uc3RyYWluIGZhY3RvciBsb2FkaW5nIGFjcm9zcyBncm91cHMgKHNhbWUgcGFyYW1ldGVyIGxhYmVsKQoKICAgICAgICBbbGF0ZW50QDBdOwogICAgICAgIGxhdGVudEAxOwoKICAgIE1vZGVsIGdpcmxzOgogICAgICAgIGxhdGVudCBCWSB4MSogKGxvYWQxKTsgISBjb25zdHJhaW4gZmFjdG9yIGxvYWRpbmcgYWNyb3NzIGdyb3VwcyAoc2FtZSBwYXJhbWV0ZXIgbGFiZWwpCiAgICAgICAgbGF0ZW50IEJZIHgyKiAobG9hZDIpOyAhIGNvbnN0cmFpbiBmYWN0b3IgbG9hZGluZyBhY3Jvc3MgZ3JvdXBzIChzYW1lIHBhcmFtZXRlciBsYWJlbCkKICAgICAgICBsYXRlbnQgQlkgeDMqIChsb2FkMyk7ICEgY29uc3RyYWluIGZhY3RvciBsb2FkaW5nIGFjcm9zcyBncm91cHMgKHNhbWUgcGFyYW1ldGVyIGxhYmVsKQoKICAgICAgICBbbGF0ZW50QDBdOwogICAgICAgIGxhdGVudEAxOwpgYGAKCiMjIyBTY2FsYXIgKFN0cm9uZyBGYWN0b3JpYWwpIEludmFyaWFuY2UgeyNzY2FsYXJJbnZhcmlhbmNlfQoKYGBgClZBUklBQkxFOgogICAgTkFNRVMgPSBncm91cCB4MSB4MiB4MyB5MTsKICAgIEdST1VQSU5HID0gZ3JvdXAgKDA9Ym95cywgMT1naXJscyk7CiAgICBNSVNTSU5HID0gLjsKICAgIFVTRVZBUklBQkxFUyA9IGdyb3VwIHgxIHgyIHgzOwoKTU9ERUw6CiAgICBNb2RlbCBib3lzOgogICAgICAgIGxhdGVudCBCWSB4MSogKGxvYWQxKTsgISBjb25zdHJhaW4gZmFjdG9yIGxvYWRpbmcgYWNyb3NzIGdyb3VwcyAoc2FtZSBwYXJhbWV0ZXIgbGFiZWwpCiAgICAgICAgbGF0ZW50IEJZIHgyKiAobG9hZDIpOyAhIGNvbnN0cmFpbiBmYWN0b3IgbG9hZGluZyBhY3Jvc3MgZ3JvdXBzIChzYW1lIHBhcmFtZXRlciBsYWJlbCkKICAgICAgICBsYXRlbnQgQlkgeDMqIChsb2FkMyk7ICEgY29uc3RyYWluIGZhY3RvciBsb2FkaW5nIGFjcm9zcyBncm91cHMgKHNhbWUgcGFyYW1ldGVyIGxhYmVsKQoKICAgICAgICBbeDFdIChpbnQxKTsgISBjb25zdHJhaW4gaW50ZXJjZXB0IGFjcm9zcyBncm91cHMgKHNhbWUgcGFyYW1ldGVyIGxhYmVsKQogICAgICAgIFt4Ml0gKGludDIpOyAhIGNvbnN0cmFpbiBpbnRlcmNlcHQgYWNyb3NzIGdyb3VwcyAoc2FtZSBwYXJhbWV0ZXIgbGFiZWwpCiAgICAgICAgW3gzXSAoaW50Myk7ICEgY29uc3RyYWluIGludGVyY2VwdCBhY3Jvc3MgZ3JvdXBzIChzYW1lIHBhcmFtZXRlciBsYWJlbCkKCiAgICAgICAgW2xhdGVudEAwXTsKICAgICAgICBsYXRlbnRAMTsKCiAgICBNb2RlbCBnaXJsczoKICAgICAgICBsYXRlbnQgQlkgeDEqIChsb2FkMSk7ICEgY29uc3RyYWluIGZhY3RvciBsb2FkaW5nIGFjcm9zcyBncm91cHMgKHNhbWUgcGFyYW1ldGVyIGxhYmVsKQogICAgICAgIGxhdGVudCBCWSB4MiogKGxvYWQyKTsgISBjb25zdHJhaW4gZmFjdG9yIGxvYWRpbmcgYWNyb3NzIGdyb3VwcyAoc2FtZSBwYXJhbWV0ZXIgbGFiZWwpCiAgICAgICAgbGF0ZW50IEJZIHgzKiAobG9hZDMpOyAhIGNvbnN0cmFpbiBmYWN0b3IgbG9hZGluZyBhY3Jvc3MgZ3JvdXBzIChzYW1lIHBhcmFtZXRlciBsYWJlbCkKCiAgICAgICAgW3gxXSAoaW50MSk7ICEgY29uc3RyYWluIGludGVyY2VwdCBhY3Jvc3MgZ3JvdXBzIChzYW1lIHBhcmFtZXRlciBsYWJlbCkKICAgICAgICBbeDJdIChpbnQyKTsgISBjb25zdHJhaW4gaW50ZXJjZXB0IGFjcm9zcyBncm91cHMgKHNhbWUgcGFyYW1ldGVyIGxhYmVsKQogICAgICAgIFt4M10gKGludDMpOyAhIGNvbnN0cmFpbiBpbnRlcmNlcHQgYWNyb3NzIGdyb3VwcyAoc2FtZSBwYXJhbWV0ZXIgbGFiZWwpCgogICAgICAgIFtsYXRlbnRAMF07CiAgICAgICAgbGF0ZW50QDE7CmBgYAoKIyBDb21tZW50cyB7I2NvbW1lbnRzfQoKYGBgCiFUaGlzIGlzIGEgY29tbWVudCBpbiBNcGx1cwpgYGAKCiMgU2V0dGluZyBQYXJhbWV0ZXIgQ29uc3RyYWludHMgeyNwYXJhbWV0ZXJDb25zdHJhaW50c30KCiMjIEZyZWVpbmcgYSBQYXJhbWV0ZXIgeyNmcmVlUGFyYW1ldGVyfQoKQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGxvYWRpbmcgb24gYSBmYWN0b3IgaXMgZml4ZWQgdG8gemVyby4KWW91IGNhbiBmcmVlbHkgZXN0aW1hdGUgdGhlIHBhcmFtZXRlciBieSBhZGRpbmcgYW4gYXN0ZXJpc2s6CgpgYGAKTU9ERUw6CiAgICBsYXRlbnQxIEJZIHgxKiB4MiB4MzsKYGBgCgojIyBDb25zdHJhaW5nIGEgUGFyYW1ldGVyIHsjY29uc3RyYWluUGFyYW1ldGVyfQoKYGBgCk1PREVMOgogICAgbGF0ZW50MSBCWSB4MUAxIHgyIHgzOwogICAgW2xhdGVudDFAMF07CiAgICBsYXRlbnQxQDE7CmBgYAoKIyMgU2V0dGluZyBUd28gUGFyYW1ldGVycyB0byBiZSBFcXVhbCB7I2VxdWFsUGFyYW1ldGVyc30KClRvIHNldCB0d28gcGFyYW1ldGVycyB0byBiZSBlcXVhbCwgcHJvdmlkZSB0aGUgc2FtZSBbcGFyYW1ldGVyIGxhYmVsXSgjcGFyYW1ldGVyTGFiZWwpIGZvciBlYWNoIHBhcmFtZXRlci4KCiMjIFNldHRpbmcgTG93ZXIgYW5kIFVwcGVyIEJvdW5kcyBvbiBhIFBhcmFtZXRlciB7I3BhcmFtZXRlckJvdW5kc30KClRvIHNldCBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9uIGEgcGFyYW1ldGVyLCB5b3UgY2FuIGFzc2lnbiB0aGUgcGFyYW1ldGVyIGEgW3BhcmFtZXRlciBsYWJlbF0oI3BhcmFtZXRlckxhYmVsKS4KVGhlbiwgeW91IGNhbiBhc3NpZ24gdGhlIGNvbnN0cmFpbnQgdG8gdGhlIHBhcmFtZXRlciAodmlhIHRoZSBsYWJlbCkgdW5kZXIgdGhlIGBNT0RFTCBDT05TVFJBSU5UYCBzZWN0aW9uLgpGb3IgZXhhbXBsZSwgdG8gY29uc3RyYWluIGEgcGFyYW1ldGVyIGJldHdlZW4gMOKAkzEsIAoKYGBgCk1PREVMOgogICAgbGF0ZW50MSBCWSB4MSogeDIgeDMgKGxvYWQzKTsKCk1PREVMIENPTlNUUkFJTlQ6CiAgICBsb2FkMyA+IDA7IGxvYWQzIDwgMTsKYGBgCgojIE91dHB1dCB7I291dHB1dH0KCmBgYApPVVRQVVQ6ICAKICAgIFNURFlYOyAKICAgIFRFQ0gxOwogICAgVEVDSDQ7CiAgICBTQU1QU1RBVDsKICAgIE1PRElORElDRVMgKEFMTCk7ICEgc3BlY2lmeSBudW1iZXIgaW4gcGFyZW50aGVzZXMgdG8gcHJpbnQgb25seSB0aG9zZSBtb2QgaW5kaWNlcyB0aGF0IGFyZSBhYm92ZSBhIHBhcnRpY3VsYXIgY2hpLXNxdWFyZSB2YWx1ZQogICAgQ0lOVEVSVkFMOwogICAgUkVTSURVQUw7CmBgYAoKIyBTYXZlIEZhY3RvciBTY29yZXMgeyNmYWN0b3JTY29yZXN9CgpgYGAKU0FWRURBVEE6CiAgICBGSUxFID0gIkM6L1tpbnNlcnRfZmlsZXBhdGhdL2ZpbGVuYW1lLmRhdCI7CiAgICBTQVZFID0gRlNDT1JFUzsKYGBgCgojIE11bHRpcGxlIEltcHV0YXRpb24geyNtdWx0aXBsZUltcHV0YXRpb259CgpGb3IgZXhhbXBsZXMgb2YgaG93IHRvIGNvbmR1Y3QgW211bHRpcGxlIGltcHV0YXRpb25dKG11bHRpcGxlSW1wdXRhdGlvbi5odG1sKSBpbiBbYE1wbHVzYF0oaHR0cHM6Ly93d3cuc3RhdG1vZGVsLmNvbSksIHNlZSBbaGVyZV0obXVsdGlwbGVJbXB1dGF0aW9uLmh0bWwjbXBsdXMpLgpUbyBydW4gYSBtb2RlbCBvbiBtdWx0aXBseSBpbXB1dGVkIGRhdGEsIHVzZSB0aGUgZm9sbG93aW5nOgoKYGBgCkRBVEE6IEZJTEUgPSAiaW1wbGlzdC5kYXQiOyAhIHdoZXJlIGltcGxpc3QuZGF0IGlzIHRoZSBuYW1lIG9mIHRoZSAqbGlzdC5kYXQgZmlsZSBzYXZlZCBmcm9tIHRoZSBpbXB1dGF0aW9uIHN0ZXAKICAgIFRZUEUgPSBJTVBVVEFUSU9OOwpgYGAKCiMgUnVuIE1vZGVscyBpbiBCYXRjaCB7I3J1bk1vZGVsc30KClJ1biBtb2RlbHMgaW4gYmF0Y2ggdmlhIGBSYDoKCmBgYHtyLCBldmFsID0gRkFMU0V9CmxpYnJhcnkoIk1wbHVzQXV0b21hdGlvbiIpCgpydW5Nb2RlbHMoCiAgZmlsZS5wYXRoKHBhdGgsICIvR2l0SHViL1Byb2plY3RfTmFtZS9BbmFseXNlcy9NcGx1cy8iKSwKICByZWN1cnNpdmUgPSBUUlVFLAogIHJlcGxhY2VPdXRmaWxlID0gImFsd2F5cyIsCiAgc2hvd091dHB1dCA9IFRSVUUpCmBgYAoKIyBNb250ZSBDYXJsbyBTaW11bGF0aW9uL1Bvd2VyIEFuYWx5c2lzIHsjbW9udGVDYXJsb30KCiMjIFNpbmdsZSBHcm91cCBNb2RlbCB7I21vbnRlQ2FybG9TaW5nbGVHcm91cH0KCmBgYApUSVRMRTogU2luZ2xlLUdyb3VwIE1vbnRlIENhcmxvIFNpbXVsYXRpb24gd2l0aCBPcmRpbmFsIEl0ZW1zIGFuZCBDb21tb24gRmFjdG9yOwoKTU9OVEVDQVJMTzoKICAgIE5BTUVTID0gdjEtdjU7ICEgdmFyaWFibGUgbmFtZXMKICAgIE5PQlNFUlZBVElPTlMgPSA1MDA7ICEgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiBlYWNoIHNhbXBsZQogICAgTlJFUFMgPSAxMDAwMDA7ICEgbnVtYmVyIG9mIHNhbXBsZXMgdG8gY3JlYXRlCiAgICBTRUVEID0gNTIyNDI7ICEgcmFuZG9tIHNlZWQKICAgIEdFTkVSQVRFID0gdjEtdjUgKDMgcCk7ICEgc3BlY2lmeSB0aGUgc2NhbGUgb2YgdGhlIERWczsgbnVtYmVyIG9mIHRocmVzaG9sZHM7IHByb2JpdCAocCkKICAgIENBVEVHT1JJQ0FMID0gdjEtdjU7ICEgc3BlY2lmeSB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIChvcmRlcmVkKSBjYXRlZ29yaWNhbAoKQU5BTFlTSVM6CiAgICBQUk9DRVNTT1JTID0gNCAxOyAhIG51bWJlciBvZiBwcm9jZXNzb3JzOyBudW1iZXIgb2YgdGhyZWFkcwogICAgRVNUSU1BVE9SID0gV0xTTVY7CiAgICBQQVJBTUVURVJJWkFUSU9OID0gVEhFVEE7CgpNT0RFTCBQT1BVTEFUSU9OOiAhIHRlbGwgTXBsdXMgaG93IHRvIGdlbmVyYXRlIHRoZSBwb3B1bGF0aW9uIGRhdGE7IGNhbiB1c2UgYXN0ZXJpc2tzICgqKSBhbmQgYXQgc3ltYm9scyAoQCkgaW50ZXJjaGFuZ2VhYmx5IGhlcmUsIGJ1dCB0aGV5IGRpZmZlciBpbiB0aGUgTU9ERUwgY29tbWFuZCAoc2VlIGJlbG93KTsgSSB1c2UgdGhlIHNhbWUgc3ltYm9sIGFzIGluIHRoZSBNT0RFTCBjb21tYW5kCiAgICBkZXAgQlkgdjEtdjUqLjc7ICEgZmFjdG9yIGxvYWRpbmdzCiAgICBbZGVwQDBdOyAhIHNldCBmYWN0b3IgbWVhbiB0byAwCiAgICBkZXBAMTsgISBzZXQgZmFjdG9yIHZhcmlhbmNlIHRvIDEgKHN0YW5kYXJkaXplKQogICAgW3YxJDEqMC41XSAodjF0MSk7IFt2MSQyKjEuMF0gKHYxdDIpOyBbdjEkMyoxLjVdICh2MXQzKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHYxCiAgICBbdjIkMSowLjVdICh2MnQxKTsgW3YyJDIqMS4wXSAodjJ0Mik7IFt2MiQzKjEuNV0gKHYydDMpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjIKICAgIFt2MyQxKjAuNV0gKHYzdDEpOyBbdjMkMioxLjBdICh2M3QyKTsgW3YzJDMqMS41XSAodjN0Myk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2MwogICAgW3Y0JDEqMC4wXSAodjR0MSk7IFt2NCQyKjAuNV0gKHY0dDIpOyBbdjQkMyoxLjBdICh2NHQzKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHY0CiAgICBbdjUkMSowLjBdICh2NXQxKTsgW3Y1JDIqMC41XSAodjV0Mik7IFt2NSQzKjEuMF0gKHY1dDMpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjUKICAgIHYxLXY1QDE7ICEgaXRlbSByZXNpZHVhbCB2YXJpYW5jZXMKCk1PREVMOiAhIHRlbGwgTXBsdXMgdG8gZXN0aW1hdGUgb3VyIG1vZGVsOyBhc3Rlcmlza3MgKCopIGFyZSBmcmVlIGVzdGltYXRlcyB3aXRoIGEgc3RhcnRpbmcgdmFsdWU7IGF0IHN5bWJvbHMgKEApIGFyZSBmaXhlZCBlc3RpbWF0ZXMKICAgIGRlcCBCWSB2MS12NSouNzsgISBmYWN0b3IgbG9hZGluZ3MKICAgIFtkZXBAMF07ICEgc2V0IGZhY3RvciBtZWFuIHRvIDAKICAgIGRlcEAxOyAhIHNldCBmYWN0b3IgdmFyaWFuY2UgdG8gMSAoc3RhbmRhcmRpemUpCiAgICBbdjEkMSowLjVdICh2MXQxKTsgW3YxJDIqMS4wXSAodjF0Mik7IFt2MSQzKjEuNV0gKHYxdDMpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjEKICAgIFt2MiQxKjAuNV0gKHYydDEpOyBbdjIkMioxLjBdICh2MnQyKTsgW3YyJDMqMS41XSAodjJ0Myk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2MgogICAgW3YzJDEqMC41XSAodjN0MSk7IFt2MyQyKjEuMF0gKHYzdDIpOyBbdjMkMyoxLjVdICh2M3QzKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHYzCiAgICBbdjQkMSowLjBdICh2NHQxKTsgW3Y0JDIqMC41XSAodjR0Mik7IFt2NCQzKjEuMF0gKHY0dDMpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjQKICAgIFt2NSQxKjAuMF0gKHY1dDEpOyBbdjUkMiowLjVdICh2NXQyKTsgW3Y1JDMqMS4wXSAodjV0Myk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2NQogICAgdjEtdjVAMTsgISBpdGVtIHJlc2lkdWFsIHZhcmlhbmNlcwoKTU9ERUwgQ09OU1RSQUlOVDoKICAgIE5FVyAoc3RkdCBzdGR0MSBzdGR0MiBzdGR0MyBub25pbnZ0IG5vbmludnQxIG5vbmludnQyIG5vbmludnQzIGRpZmYpOwogICAgCiAgICBzdGR0MSA9ICh2MXQxICsgdjJ0MSArIHYzdDEpIC8gMzsKICAgIHN0ZHQyID0gKHYxdDIgKyB2MnQyICsgdjN0MikgLyAzOwogICAgc3RkdDMgPSAodjF0MyArIHYydDMgKyB2M3QzKSAvIDM7CiAgICAKICAgIG5vbmludnQxID0gKHY0dDEgKyB2NXQxKSAvIDI7CiAgICBub25pbnZ0MiA9ICh2NHQyICsgdjV0MikgLyAyOwogICAgbm9uaW52dDMgPSAodjR0MyArIHY1dDMpIC8gMjsKICAgIAogICAgc3RkdCA9IChzdGR0MSArIHN0ZHQyICsgc3RkdDMpIC8gMzsKICAgIG5vbmludnQgPSAobm9uaW52dDEgKyBub25pbnZ0MiArIG5vbmludnQzKSAvIDM7CiAgICAKICAgIGRpZmYgPSBub25pbnZ0IC0gc3RkdDsKCk9VVFBVVDoKICAgIFRFQ0g5OwpgYGAKCiMjIE11bHRpLUdyb3VwIE1vZGVsIHsjbW9udGVDYXJsb011bHRpZ3JvdXB9CgpgYGAKVElUTEU6IE11bHRpLUdyb3VwIE1vbnRlIENhcmxvIFNpbXVsYXRpb24gd2l0aCBPcmRpbmFsIEl0ZW1zIGFuZCBDb21tb24gRmFjdG9yOwoKTU9OVEVDQVJMTzoKICAgIE5BTUVTID0gdjEtdjU7ICEgdmFyaWFibGUgbmFtZXMKICAgIE5HUk9VUFMgPSAyOyAhIG51bWJlciBvZiBncm91cHMKICAgIE5PQlNFUlZBVElPTlMgPSA1MDAgMzAwOyAhIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgaW4gZWFjaCBzYW1wbGUKICAgIE5SRVBTID0gMTAwMDAwOyAhIG51bWJlciBvZiBzYW1wbGVzIHRvIGNyZWF0ZQogICAgU0VFRCA9IDUyMjQyOyAhIHJhbmRvbSBzZWVkCiAgICBHRU5FUkFURSA9IHYxLXY1ICgzIHApOyAhIHNwZWNpZnkgdGhlIHNjYWxlIG9mIHRoZSBEVnM7IG51bWJlciBvZiB0aHJlc2hvbGRzOyBwcm9iaXQgKHApCiAgICBDQVRFR09SSUNBTCA9IHYxLXY1OyAhIHNwZWNpZnkgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSAob3JkZXJlZCkgY2F0ZWdvcmljYWwKCkFOQUxZU0lTOgogICAgUFJPQ0VTU09SUyA9IDQgMTsgISBudW1iZXIgb2YgcHJvY2Vzc29yczsgbnVtYmVyIG9mIHRocmVhZHMKICAgIEVTVElNQVRPUiA9IFdMU01WOwogICAgUEFSQU1FVEVSSVpBVElPTiA9IFRIRVRBOwoKTU9ERUwgUE9QVUxBVElPTjogISB0ZWxsIE1wbHVzIGhvdyB0byBnZW5lcmF0ZSB0aGUgcG9wdWxhdGlvbiBkYXRhOyBjYW4gdXNlIGFzdGVyaXNrcyAoKikgYW5kIGF0IHN5bWJvbHMgKEApIGludGVyY2hhbmdlYWJseSBoZXJlLCBidXQgdGhleSBkaWZmZXIgaW4gdGhlIE1PREVMIGNvbW1hbmQgKHNlZSBiZWxvdyk7IEkgdXNlIHRoZSBzYW1lIHN5bWJvbCBhcyBpbiB0aGUgTU9ERUwgY29tbWFuZAogICAgZGVwIEJZIHYxLXY1Ki43OyAhIGZhY3RvciBsb2FkaW5ncwogICAgW2RlcEAwXTsgISBzZXQgZmFjdG9yIG1lYW4gdG8gMAogICAgZGVwQDE7ICEgc2V0IGZhY3RvciB2YXJpYW5jZSB0byAxIChzdGFuZGFyZGl6ZSkKICAgIFt2MSQxKjAuNV0gKHYxdDFnMSk7IFt2MSQyKjEuMF0gKHYxdDJnMSk7IFt2MSQzKjEuNV0gKHYxdDNnMSk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2MQogICAgW3YyJDEqMC41XSAodjJ0MWcxKTsgW3YyJDIqMS4wXSAodjJ0MmcxKTsgW3YyJDMqMS41XSAodjJ0M2cxKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHYyCiAgICBbdjMkMSowLjVdICh2M3QxZzEpOyBbdjMkMioxLjBdICh2M3QyZzEpOyBbdjMkMyoxLjVdICh2M3QzZzEpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjMKICAgIFt2NCQxKjAuNV0gKHY0dDFnMSk7IFt2NCQyKjEuMF0gKHY0dDJnMSk7IFt2NCQzKjEuNV0gKHY0dDNnMSk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2NAogICAgW3Y1JDEqMC41XSAodjV0MWcxKTsgW3Y1JDIqMS4wXSAodjV0MmcxKTsgW3Y1JDMqMS41XSAodjV0M2cxKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHY1CiAgICB2MS12NUAxOyAhIGl0ZW0gcmVzaWR1YWwgdmFyaWFuY2VzCiAgICAKTU9ERUwgUE9QVUxBVElPTi1nMjogISB0ZWxsIE1wbHVzIGhvdyB0byBnZW5lcmF0ZSB0aGUgcG9wdWxhdGlvbiBkYXRhIGZvciBncm91cCAyOyBjYW4gdXNlIGFzdGVyaXNrcyAoKikgYW5kIGF0IHN5bWJvbHMgKEApIGludGVyY2hhbmdlYWJseSBoZXJlLCBidXQgdGhleSBkaWZmZXIgaW4gdGhlIE1PREVMIGNvbW1hbmQgKHNlZSBiZWxvdyk7IEkgdXNlIHRoZSBzYW1lIHN5bWJvbCBhcyBpbiB0aGUgTU9ERUwgY29tbWFuZAogICAgIWRlcCBCWSB2MS12NSouNzsgISBmYWN0b3IgbG9hZGluZ3MKICAgICFbZGVwQDBdOyAhIHNldCBmYWN0b3IgbWVhbiB0byAwCiAgICAhZGVwQDE7ICEgc2V0IGZhY3RvciB2YXJpYW5jZSB0byAxIChzdGFuZGFyZGl6ZSkKICAgIFt2MSQxKjAuNV0gKHYxdDFnMik7IFt2MSQyKjEuMF0gKHYxdDJnMik7IFt2MSQzKjEuNV0gKHYxdDNnMik7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2MQogICAgW3YyJDEqMC41XSAodjJ0MWcyKTsgW3YyJDIqMS4wXSAodjJ0MmcyKTsgW3YyJDMqMS41XSAodjJ0M2cyKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHYyCiAgICBbdjMkMSowLjVdICh2M3QxZzIpOyBbdjMkMioxLjBdICh2M3QyZzIpOyBbdjMkMyoxLjVdICh2M3QzZzIpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjMKICAgIFt2NCQxKjAuMF0gKHY0dDFnMik7IFt2NCQyKjAuNV0gKHY0dDJnMik7IFt2NCQzKjEuMF0gKHY0dDNnMik7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2NAogICAgW3Y1JDEqMC4wXSAodjV0MWcyKTsgW3Y1JDIqMC41XSAodjV0MmcyKTsgW3Y1JDMqMS4wXSAodjV0M2cyKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHY1CiAgICAhdjEtdjVAMTsgISBpdGVtIHJlc2lkdWFsIHZhcmlhbmNlcwoKTU9ERUw6ICEgdGVsbCBNcGx1cyB0byBlc3RpbWF0ZSBvdXIgbW9kZWw7IGFzdGVyaXNrcyAoKikgYXJlIGZyZWUgZXN0aW1hdGVzIHdpdGggYSBzdGFydGluZyB2YWx1ZTsgYXQgc3ltYm9scyAoQCkgYXJlIGZpeGVkIGVzdGltYXRlcwogICAgZGVwIEJZIHYxLXY1Ki43OyAhIGZhY3RvciBsb2FkaW5ncwogICAgW2RlcEAwXTsgISBzZXQgZmFjdG9yIG1lYW4gdG8gMAogICAgZGVwQDE7ICEgc2V0IGZhY3RvciB2YXJpYW5jZSB0byAxIChzdGFuZGFyZGl6ZSkKICAgIFt2MSQxKjAuNV0gKHYxdDFnMSk7IFt2MSQyKjEuMF0gKHYxdDJnMSk7IFt2MSQzKjEuNV0gKHYxdDNnMSk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2MQogICAgW3YyJDEqMC41XSAodjJ0MWcxKTsgW3YyJDIqMS4wXSAodjJ0MmcxKTsgW3YyJDMqMS41XSAodjJ0M2cxKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHYyCiAgICBbdjMkMSowLjVdICh2M3QxZzEpOyBbdjMkMioxLjBdICh2M3QyZzEpOyBbdjMkMyoxLjVdICh2M3QzZzEpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjMKICAgIFt2NCQxKjAuNV0gKHY0dDFnMSk7IFt2NCQyKjEuMF0gKHY0dDJnMSk7IFt2NCQzKjEuNV0gKHY0dDNnMSk7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2NAogICAgW3Y1JDEqMC41XSAodjV0MWcxKTsgW3Y1JDIqMS4wXSAodjV0MmcxKTsgW3Y1JDMqMS41XSAodjV0M2cxKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHY1CiAgICB2MS12NUAxOyAhIGl0ZW0gcmVzaWR1YWwgdmFyaWFuY2VzCiAgIApNT0RFTCBnMjogISB0ZWxsIE1wbHVzIHRvIGVzdGltYXRlIG91ciBtb2RlbCBpbiBncm91cCAyOyBhc3Rlcmlza3MgKCopIGFyZSBmcmVlIGVzdGltYXRlcyB3aXRoIGEgc3RhcnRpbmcgdmFsdWU7IGF0IHN5bWJvbHMgKEApIGFyZSBmaXhlZCBlc3RpbWF0ZXMKICAgICFkZXAgQlkgdjEtdjUqLjc7ICEgZmFjdG9yIGxvYWRpbmdzCiAgICAhW2RlcEAwXTsgISBzZXQgZmFjdG9yIG1lYW4gdG8gMAogICAgIWRlcEAxOyAhIHNldCBmYWN0b3IgdmFyaWFuY2UgdG8gMSAoc3RhbmRhcmRpemUpCiAgICBbdjEkMSowLjVdICh2MXQxZzIpOyBbdjEkMioxLjBdICh2MXQyZzIpOyBbdjEkMyoxLjVdICh2MXQzZzIpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjEKICAgIFt2MiQxKjAuNV0gKHYydDFnMik7IFt2MiQyKjEuMF0gKHYydDJnMik7IFt2MiQzKjEuNV0gKHYydDNnMik7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2MgogICAgW3YzJDEqMC41XSAodjN0MWcyKTsgW3YzJDIqMS4wXSAodjN0MmcyKTsgW3YzJDMqMS41XSAodjN0M2cyKTsgISBpdGVtIHRocmVzaG9sZHMgZm9yIHYzCiAgICBbdjQkMSowLjBdICh2NHQxZzIpOyBbdjQkMiowLjVdICh2NHQyZzIpOyBbdjQkMyoxLjBdICh2NHQzZzIpOyAhIGl0ZW0gdGhyZXNob2xkcyBmb3IgdjQKICAgIFt2NSQxKjAuMF0gKHY1dDFnMik7IFt2NSQyKjAuNV0gKHY1dDJnMik7IFt2NSQzKjEuMF0gKHY1dDNnMik7ICEgaXRlbSB0aHJlc2hvbGRzIGZvciB2NQogICAgIXYxLXY1QDE7ICEgaXRlbSByZXNpZHVhbCB2YXJpYW5jZXMKCk1PREVMIENPTlNUUkFJTlQ6CiAgICBORVcgKHN0ZHQxZzEgc3RkdDJnMSBzdGR0M2cxIHN0ZHQxZzIgc3RkdDJnMiBzdGR0M2cyCiAgICBub25pdDFnMSBub25pdDJnMSBub25pdDNnMSBub25pdDFnMiBub25pdDJnMiBub25pdDNnMgogICAgc3RkdGcxIHN0ZHRnMiBub25pdGcxIG5vbml0ZzIgZGlmZndnIGRpZmZiZyk7CiAgICAKICAgIHN0ZHQxZzEgPSAodjF0MWcxICsgdjJ0MWcxICsgdjN0MWcxKSAvIDM7CiAgICBzdGR0MmcxID0gKHYxdDJnMSArIHYydDJnMSArIHYzdDJnMSkgLyAzOwogICAgc3RkdDNnMSA9ICh2MXQzZzEgKyB2MnQzZzEgKyB2M3QzZzEpIC8gMzsKICAgIAogICAgc3RkdDFnMiA9ICh2MXQxZzIgKyB2MnQxZzIgKyB2M3QxZzIpIC8gMzsKICAgIHN0ZHQyZzIgPSAodjF0MmcyICsgdjJ0MmcyICsgdjN0MmcyKSAvIDM7CiAgICBzdGR0M2cyID0gKHYxdDNnMiArIHYydDNnMiArIHYzdDNnMikgLyAzOwogICAgCiAgICBub25pdDFnMSA9ICh2NHQxZzEgKyB2NXQxZzEpIC8gMjsKICAgIG5vbml0MmcxID0gKHY0dDJnMSArIHY1dDJnMSkgLyAyOwogICAgbm9uaXQzZzEgPSAodjR0M2cxICsgdjV0M2cxKSAvIDI7CiAgICAKICAgIG5vbml0MWcyID0gKHY0dDFnMiArIHY1dDFnMikgLyAyOwogICAgbm9uaXQyZzIgPSAodjR0MmcyICsgdjV0MmcyKSAvIDI7CiAgICBub25pdDNnMiA9ICh2NHQzZzIgKyB2NXQzZzIpIC8gMjsKICAgIAogICAgc3RkdGcxID0gKHN0ZHQxZzEgKyBzdGR0MmcxICsgc3RkdDNnMSkgLyAzOwogICAgc3RkdGcyID0gKHN0ZHQxZzIgKyBzdGR0MmcyICsgc3RkdDNnMikgLyAzOwogICAgCiAgICBub25pdGcxID0gKG5vbml0MWcxICsgbm9uaXQyZzEgKyBub25pdDNnMSkgLyAzOwogICAgbm9uaXRnMiA9IChub25pdDFnMiArIG5vbml0MmcyICsgbm9uaXQzZzIpIC8gMzsKICAgIAogICAgZGlmZndnID0gbm9uaXRnMiAtIHN0ZHRnMjsgISBkaWZmZXJlbmNlIHdpdGhpbiBncm91cAogICAgCiAgICBkaWZmYmcgPSBub25pdGcyIC0gbm9uaXRnMTsgISBkaWZmZXJlbmNlIGJldHdlZW4gZ3JvdXBzCiAgICAKT1VUUFVUOgogICAgVEVDSDk7CmBgYAoKIyBTZXNzaW9uIEluZm8KCmBgYHtyLCBjbGFzcy5zb3VyY2UgPSAiZm9sZC1oaWRlIn0Kc2Vzc2lvbkluZm8oKQpgYGAK



Developmental Psychopathology Lab